Kotlin带有泛型的次构造函数

10
在Java中,我可以实现两个构造函数,例如:
public TargetTitleEntryController() { }

public <T extends Controller & TargetTitleEntryControllerListener> TargetTitleEntryController(T targetController) {
        setTargetController(targetController);
}

我想把它转换成Kotlin

class TargetTitleEntryController ()

使用次要构造函数。我不知道如何像Java对应项一样声明带有通用类型。
3个回答

8

Kotlin 中没有交叉类型(遗憾)

但是有 泛型约束 (希望)

但是 泛型约束 不适用于次构造函数(遗憾)

但是你可以在伴生对象中使用 Invoke 操作符重载 来模拟次构造函数(解决方法):

class TargetTitleEntryController {

    // ...

    companion object {

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

2
这是一个示例,你需要指定一个实现了两个接口(CharSequenceRunnable)的类型 T:
class Person<T>(val name: String) where T : CharSequence, T : Runnable {
    constructor(name: String, parent: T) : this(name) {
    }
}

实际上,像这样的内容应该可以运行:
class TargetTitleEntryController<T> () where T : Controller, T : TargetTitleEntryControllerListener {
    constructor(targetController: T) : this() {
    }
}

4
这与原帖中的示例不同,因为构造函数上的通用类型并未附加到类的类型参数上。 - Louis Wasserman
@KenZira 我不知道在 Kotlin 中有没有可能在不使用上述解决方法的情况下将类型附加到次要构造函数。 - gil.fernandes

0
你可以这样做 :)
class TargetTitleEntryController <T>() : Controller() where T: Controller, T: TargetTitleEntryControllerListener<T> {

 constructor(target: T) : this() {
        targetController = target
    }
}

你可以在父控制器中像这样实现它:

class TargetDisplayController : Controller(), TargetTitleEntryControllerListener<TargetDisplayController> {

  var targetTitleEntryController = TargetTitleEntryController(this)

  override fun onTitlePicked(String option) {

  }

  override fun onAttach(view: View) {
  // push controller here
  }
}

在你的问题中,setTargetController(targetController); 的实现是 targetController = target 在我的回答中。 - raquezha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接