假设我有以下类,带有一个类型参数 T(在这个例子中它有界有助于说明后面的例子,但是当它没有界时错误仍然存在):
class GenericsTest<T : CharSequence>(private var cs: T)
现在假设我想给这个类添加一个辅助构造函数。我怎样才能做到这一点?我的第一次(幼稚)尝试导致编译器错误:
class GenericsTest<T : CharSequence>(private var cs: T)
{
// dummy exists to ensure the method signatures are different
constructor(cs: String, dummy: Int) : this("a")
}
IntelliJ 在 "a"
下划线显示消息:
Type mismatch.
Required: T
Found: String
对我来说,String
似乎是一个完全有效的 T
。我认为明确指定类型参数会有所帮助,但这似乎是不允许的。这两种尝试都是不正确的语法:
constructor(cs: String, dummy: Int) : this<String>("a")
constructor<U : String>(cs: U, dummy: Int) : this("a")
因为我怀疑所有这些场景都有一个通用的方法,所以我的主要问题是:
如何在 Kotlin 中为泛型类编写辅助构造函数?或者类似的,当构造函数有类型参数时,如何委托(delegate)给主构造函数?
这可能吗?如果没有,一种解决方法可能是使用辅助函数来使用主构造函数创建对象,但这不适用于例如抽象类。
关于generics的官方文档不讨论构造函数。
最佳答案
另一种对辅助函数进行分组的方法:可以将伴随对象设为可调用。
class GenericsTest<T : CharSequence>(private var cs: T) {
companion object {
operator fun invoke(cs: String, dummy: Int) = GenericsTest(cs)
}
}
GenericsTest("a", 1)
它不是真正的构造函数,但看起来像一个。与独立函数相比的一个好处是,即使被调用的构造函数是 private
,它也能正常工作。
关于generics - 如何为具有类型参数的类编写辅助构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48220564/