generics - 如何为具有类型参数的类编写辅助构造函数?

标签 generics constructor kotlin

假设我有以下类,带有一个类型参数 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/

相关文章:

java - 在 Kotlin 中使用 Room 的 @ForeignKey 作为 @Entity 参数

c# - 是否可以对泛型方法进行不安全的协变调用?

c++ - 如果基类构造函数不是 constexpr,我能否使派生类的构造函数为 constexpr?

swift - 可选绑定(bind),与泛型类型无关

c++ - 从另一个构造函数调用构造函数?

java - 为什么 java 中没有 Optional 的公共(public)构造函数?

kotlin - 表达时自定义Kotlin

android - 如何使用批注在改造请求中动态添加授权 header ?

java - 使用泛型转换 Java 集合的正确方法签名

f# - 如何在 F# 中声明返回满足多个约束的类型的泛型函数?