具有通用类型的Kotlin二级构造函数

Ken*_*ira 5 kotlin

在java中

我可以实现两个像

public TargetTitleEntryController() { }

public <T extends Controller & TargetTitleEntryControllerListener> TargetTitleEntryController(T targetController) {
        setTargetController(targetController);
}
Run Code Online (Sandbox Code Playgroud)

我想将其转换为Kotlin

class TargetTitleEntryController ()
Run Code Online (Sandbox Code Playgroud)

与辅助构造函数。我不知道如何用Java对应的泛型类型声明。

小智 9

Kotlin 中没有交集类型(悲伤)

但存在通用约束(希望)

通用约束不适用于辅助构造函数(悲伤)

但是您可以使用Invoke 运算符重载(解决方法)在伴生对象中模拟辅助构造函数:

class TargetTitleEntryController {

    // ...

    companion object {

        operator fun <T> invoke(targetController: T): TargetTitleEntryController
                where T : Controller,
                      T : TargetTitleEntryControllerListener {
            return TargetTitleEntryController().apply {
                setTargetController(targetController)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


gil*_*des 2

下面是一个示例,其中指定T实现两个接口 ( CharSequenceRunnable) 的 Type:

class Person<T>(val name: String) where T : CharSequence, T : Runnable {
    constructor(name: String, parent: T) : this(name) {
    }
}
Run Code Online (Sandbox Code Playgroud)

所以实际上这样的事情应该有效:

class TargetTitleEntryController<T> () where T : Controller, T : TargetTitleEntryControllerListener {
    constructor(targetController: T) : this() {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这与 OP 的示例不同,其中构造函数上的泛型不附加到类上的类型参数。 (4认同)