Kotlin:带有此关键字的辅助构造函数

时间:2017-07-13 20:37:09

标签: kotlin

data class DisjointSetNode<T>(var parent: DisjointSetNode<T>, var data: T, var rank: Int) {
constructor(data: T): this(parent = this, data = data, rank = 0)

我想知道为什么我收到错误,说我不能在构造函数调用中使用this关键字,因为我没有先调用超类构造函数。没有超类,我想让自己成为父类。关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:0)

您无法在此上下文中引用this,因为它尚未定义。

但是,您可以将parent移到构造函数签名之外。 e.g:

data class DisjointSetNode<T>(var data: T, var rank: Int = 0) {
    var parent: DisjointSetNode<T> = this
}

答案 1 :(得分:0)

问题是,在this调用另一个构造函数期间,您无法调用this(...)。你可以看看JLS

  

构造函数的编译时错误直接间接通过一系列一个或多个显式构造函数调用来调用自身涉及这个

  • 直接表示在第一个语句中调用this中的this(...),例如:this(this);

  • 间接表示在致电this(...)期间致电其成员,例如:this(parent)

但您可以将主要构造函数设置为辅助构造函数以实现您的方式,例如:

data class DisjointSetNode<T>(var data: T, var rank: Int = 0) {
    var parent: DisjointSetNode<T> = this

    constructor(parent: DisjointSetNode<T>, data: T) : this(data = data){
        this.parent = parent
    }
}