我试图弄清楚如何为泛型类创建辅助构造函数,因此我基本上可以轻松创建它的“默认”版本。这段代码对我来说似乎很合理 - 辅助构造函数使用具体的 T: 表调用主构造函数。但编译器似乎没有认识到这一点,为辅助构造函数给出“类型不匹配:推断类型是 Scratch_5.Furniture.table 但预期为 T”。
sealed class Furniture {
class NamedChair(name: String) : Furniture()
object Table : Furniture()
}
class Blah<T : Furniture>(
data: T
) {
constructor() : this(Furniture.Table)
}
var blah = Blah(Furniture.Table)
var equalBlah = Blah()
但是,
var blah = Blah(Furniture.Table)
使用主构造函数的行工作得很好。我在这里有什么遗漏吗?我将如何修改它以使其工作?
最佳答案
当主构造函数具有泛型参数时,您不能拥有具体的辅助构造函数。
但是,您可以使用 operator fun invoke()
使用一个小技巧来实现相同的效果。在 Blah
:
class Blah<T : Furniture>(data: T) {
companion object {
operator fun invoke(): Blah<Furniture.Table> = Blah(Furniture.Table)
}
}
或者您可以使用
fun
命名为 Blah
(感谢@AlexeyRomanov):fun Blah(): Blah<Furniture.Table> = Blah(Furniture.Table)
现在您可以成功调用:
var blah = Blah(Furniture.Table)
// Calls the invoke operator fun which invokes the primary constructor.
var equalBlah = Blah()
关于generics - 当主构造函数是通用的时,如何在 Kotlin 中制作具体的辅助构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60846500/