如何为带有类型参数的类编写二级构造函数?

and*_*j88 3 generics constructor kotlin

假设我有以下类,带有一个类型参数 T(在这个例子中它有界以帮助说明后面的例子,但当它无界时错误仍然存​​在):

class GenericsTest<T : CharSequence>(private var cs: T)
Run Code Online (Sandbox Code Playgroud)

现在假设我想向这个类添加一个辅助构造函数。我怎样才能做到这一点?我的第一次(天真)尝试导致编译器错误:

class GenericsTest<T : CharSequence>(private var cs: T)
{
    // dummy exists to ensure the method signatures are different
    constructor(cs: String, dummy: Int) : this("a") 
}
Run Code Online (Sandbox Code Playgroud)

IntelliJ"a"用以下消息强调:

Type mismatch.
Required: T
Found: String
Run Code Online (Sandbox Code Playgroud)

对我来说,String似乎是一个完全有效的T. 我认为明确指定类型参数会有所帮助,但这似乎是不允许的。这两种尝试都是不正确的语法:

constructor(cs: String, dummy: Int) : this<String>("a")
constructor<U : String>(cs: U, dummy: Int) : this("a")
Run Code Online (Sandbox Code Playgroud)

由于我怀疑所有这些场景都有一个通用的方法,我的主要问题是:

你如何在 Kotlin 中为泛型类编写二级构造函数?或者类似地,当构造函数具有类型参数时,您如何委托给主构造函数?

这甚至可能吗?如果没有,一种解决方法可能是使用辅助函数使用主构造函数创建对象,但这不适用于抽象类。

关于泛型的官方文档没有讨论构造函数。

eph*_*ent 5

对辅助函数进行分组的另一种方法:可以使伴随对象成为可调用对象。

class GenericsTest<T : CharSequence>(private var cs: T) {
    companion object {
        operator fun invoke(cs: String, dummy: Int) = GenericsTest(cs)
    }
}

GenericsTest("a", 1)
Run Code Online (Sandbox Code Playgroud)

它不是真正的构造函数,但看起来像一个构造函数。与独立函数相比的一个好处是,即使被调用的构造函数是private.