Kotlin泛型自定义使用通配符的类型
所以在Java中我可以做到以下几点,定义一个具有超类和接口约束的类型。
public class Main<ControllerType extends Node & Controller> { private ControllerType controller; private ControllerType controller2; private Main(ControllerType controller, ControllerType controller2) { this.controller = controller; this.controller2 = controller2; } public static void main(String[] args) { Main<?> main = new Main<>(new Home(), new Parent()); } }
但是在Kotlin这是不可能的。
class Main<ControllerType>(val controller: ControllerType, val controller2: ControllerType) where ControllerType : Node, ControllerType : Controller fun main(args: Array<String>) { val main = Main<*>(Home(), Parent()) }
我在星形投影上得到以下错误:
函数和属性的类型参数不允许投影
那么怎么可能解决这个问题。 我看着类型别名,但他们没有我想要的功能。
不,没有办法像通配符那样用Java来完成。 这是不可能的,因为通配符不安全。
private Main(ControllerType controller, ControllerType controller2)
controller
和controller2
假设是相同的或继承的类型,但是Java允许你使用通配符来输入。
星型投影不是通配符替换。 当您不知道确切类型并且允许您执行安全操作时,您使用星形投影。
如果controller
和controller2
是两个不同的类型,那么你应该有两个通用的参数。
class Main<T, U>(val controller: T, val controller2: U) where T : Node, T : Controller, U : Node, U : Controller fun main(args: Array<String>) { val main = Main(Home(), Parent()) }