generics - 当主构造函数是通用的时,如何在 Kotlin 中制作具体的辅助构造函数?

标签 generics kotlin constructor

我试图弄清楚如何为泛型类创建辅助构造函数,因此我基本上可以轻松创建它的“默认”版本。这段代码对我来说似乎很合理 - 辅助构造函数使用具体的 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/

相关文章:

java - getClass 返回什么类型?

Android Studio 在启用 View 绑定(bind)后给出错误和警告。怎么修?

android - Kotlin:如何使用 View 模型/接口(interface)将 fragment 中的数据从 recyclerview 传递到另一个 fragment ?

c++ - 对c++构造函数删除感到困惑

C# : Passing a Generic Object

java - 如何传递类型为Class<T[]> java的参数

基于对象类型的 Java getter 返回类型

android - 如何在运行时从共享首选项更改 Retrofit baseUrl

继承类上的 C# 无参数构造函数

c++ - 如何使用std::optional for error handling when creating objects without instantly destructing them?