在开放的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); } }
关于这个解决方案的警告是,你的数据类必须为它的所有属性提供默认值,因为有一个隐含的调用构造函数的参数为零。