首页 > 解决方案 > 来自 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 来说还是很新的。

标签: javakotlin

解决方案


您需要添加id到您的构造函数并在扩展时将其传递给基类构造函数。

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 
        )
    }
}

这就是“使用构造函数”的意思吗?如果你不想有构造函数,你必须在你的基类中使用getter/setter(注意我不推荐以下,为了说明而显示)——

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;
        }

    }
}

然后,您没有链接构造函数,但这有一个很大的缺点 -id不是数据类的一部分,toString, copy,equals等只会使用data类的构造函数中的值生成。如果你toString使用上面的方法调用一个对象,你会看到它只使用nameand desc


推荐阅读