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关键字,因为我没有先调用超类的构造函数。 没有超类,我想让自己成为父母。 任何想法,我会怎么做呢?

问题是你不能通过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 } } 

你不能在这个上下文中引用this ,因为它尚未定义。

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

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