Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自Java超类构造函数访问的Kotlin构造函数_Java_Kotlin - Fatal编程技术网

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

来自Java超类构造函数访问的Kotlin构造函数,java,kotlin,Java,Kotlin,我不认为我的头衔会更让人困惑。我正在将Kotlin集成到现有的Java项目中。我有一个Java类,基本上是这样定义的: class EntityBase { private Long id; public EntityBase() { } public EntityBase(Long id) { this.id = id; } } 然后,我定义了一个类似于这样的Kotlin数据类,并尝试使用一个伴随方法从DTO中水合该对象,但我无法通过对象创建从该方法访问EntityBas

我不认为我的头衔会更让人困惑。我正在将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还是个新手。

您需要将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等将仅使用数据类构造函数中的值生成。如果使用上述方法调用对象上的toString,您将看到它只使用name和desc。

是的,就是这样。你的后一个例子是我试图让它工作,但我错过了你的前一个解决方案。谢谢