在开放的Kotlin数据DTO类上从Java调用“super(prototype)”

我有一个Kotlin类,类似于

data open class MyDto ( var property: String? = null // ... ) 

和一个扩展这个类的Java类,类似于

 class MySpecificDto extends MyDto { private String field; // getter/setter for "field" public MySpecificDto(final MyDto prototype) { super(prototype); } } 

Kotlin的DTO中“超(原型)”语句编译时缺少什么?

MyDto的构造函数接受一个String类型的参数,并且正在尝试将它传递给MyDto

我想你正在寻找 –

 super(prototype.getProperty()); 

数据类似乎是DTO层次结构的逻辑基础。 不幸的是,他们在继承方面打得不好,所以这样做不是一个好主意。 看到这个答案 。

更新以解决评论 –

对于Kotlin方面的解决方案,您需要记住Kotlin类只允许一个构造函数。 对于数据类,该构造函数的格式已经定义好了,所以你不能只传递一个对象并使其工作,或者定义一个不同的构造函数。 另外,正如@bashor在你的原始问题中所指出的,没有拷贝构造函数。 但是,如果你想要,你可以创建一个独立的函数来初始化你的对象 –

 data open class MyDto (var property: String? = null //...) { fun init(dto: MyDto) { property = dto.property //... rest of the properties } } 

并在你的Java构造函数调用init而不是super

 public class MySpecificDto extends MyDto { private String field; public MySpecificDto(final MyDto prototype) { init(prototype); } } 

关于这个解决方案的警告是,你的数据类必须为它的所有属性提供默认值,因为有一个隐含的调用构造函数的参数为​​零。