java - 来自 Java 父类(super class)构造函数访问的 Kotlin 构造函数

标签 java kotlin

我认为我的标题不会再令人困惑了。我正在将 Kotlin 集成到现有的 Java 项目中。我有一个 Java 类,基本上是这样定义的:

class EntityBase {
   private Long id;

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

然后,我定义了一个像这样的 Kotlin 数据类,并尝试使用配套方法从 DTO 中水合该对象,但我无法从该方法通过对象创建:

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 来说还很陌生。

最佳答案

您需要将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 不是数据类的一部分,toStringcopy equals 等只会使用 data 类的构造函数中的值生成。如果您使用上述方法在对象上调用 toString,您将看到它仅使用 namedesc

关于java - 来自 Java 父类(super class)构造函数访问的 Kotlin 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50067945/

相关文章:

java - Java 6接口(interface)MultivaluedMap有什么用?

java - Apache Mina SSHD 1.0.0 设置用户目录和映射

android - 尝试从图库中选取图像时出现 TransactionTooLargeException

java - removeall 和 removeif 的用例

kotlin - 为什么 Kotlin 初始化 block 中不允许 `return`?

java - Maven:使用命令行运行java类文件

java - 如何使用来自外部客户端的异步进程?

java - 将文件从jsp发送到action

kotlin - 如何在 Kotlin 中强制执行空的非空字符串?

Kotlin 通用属性