呼叫"超级(原型)"来自Java的一个开放的Kotlin数据DTO类

时间:2014-11-06 13:03:34

标签: java kotlin

我有一个类似于

的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中有哪些“超级(原型)”语句需要编译?

1 个答案:

答案 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);
    }
}

此解决方案的警告是,您的数据类必须为其所有属性提供默认值,因为隐式调用构造函数且参数为零。