来自Java超类构造函数访问的Kotlin构造函数

时间:2018-04-27 18:03:16

标签: java kotlin

我认为我的标题可能更令人困惑。我将Kotlin集成到现有的Java项目中。我有一个基本上定义的Java类:

class EntityBase {
   private Long id;

   public EntityBase() { }
   public EntityBase(Long id) { this.id = id; }
}

然后,我已经定义了一个像这样的Kotlin数据类,并且我尝试使用配套方法从DTO中保湿这个对象,但是我无法访问EntityBase.id从这个方法到对象创建:

data class Thing(
   val name: String,
   val desc: String
) : EntityBase() {

  companion object {

    fun fromDto(dto: ThingDto) = Thing(
       name = dto.name,
       desc = dto.desc
       id = dto.id // this doesn't work because id isn't part of Thing's constructor
    )

}

我可以通过使用构造函数而不是伴随对象来解决这个问题,但我很好奇有没有办法去做我不知道的事情。对Kotlin来说还是一个新手。

1 个答案:

答案 0 :(得分:1)

您需要将tdiff = current_time - date_parsed.replace(year=current_time.year) if tdiff.days < 0: tdiff = current_time - date_parsed.replace(year=current_time.year-1) 添加到构造函数中,并在扩展时将其传递给基类构造函数。

id

这就是“使用构造函数”的意思吗?如果你不想拥有构造函数,你必须在你的基类中使用getter / setter(注意我不建议使用以下内容,以示插图) -

private data class Thing(
        val name: String,
        val desc: String,
        val id: Long
) : EntityBase(id) {

    companion object {
        fun fromDto(dto: ThingDto) = Thing(
                name = dto.name,
                desc = dto.desc,
                id = dto.id 
        )
    }
}

然后你可以做 -

class EntityBase {
   private Long id;

   public EntityBase() { }
   public EntityBase(Long id) { this.id = id; }
   public void setId(Long id) { this.id = id; }
   public Long getId() { return id; }
}

然后,您没有链接构造函数,但这有很大的缺点 - private data class Thing( val name: String, val desc: String ) : EntityBase() { companion object { fun fromDto(dto: ThingDto) : Thing { val thing = Thing( name = dto.name, desc = dto.desc) thing.id = dto.id; return thing; } } } 不是数据类的一部分,idtoString,{{1}只会使用copy类的构造函数中的值生成等等。如果您使用上述内容对某个对象发送equals,则会看到它仅使用datatoString