我有一个类似于
的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中有哪些“超级(原型)”语句需要编译?
答案 0 :(得分:2)
MyDto
的构造函数接受String类型的单个参数,并且您尝试将其传递给MyDto
。
我认为你在寻找 -
super(prototype.getProperty());
数据类似乎是DTO层次结构的逻辑基础。不幸的是,它们在继承方面表现不佳,所以这样做并不是一个好主意。请参阅this answer。
更新以发表评论
对于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);
}
}
此解决方案的警告是,您的数据类必须为其所有属性提供默认值,因为隐式调用构造函数且参数为零。