作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,在 Java 中,我可以执行以下操作,定义具有父类(super class)和接口(interface)约束的类型。
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())
}
我在星形投影上收到以下错误:
Projections are not allowed on type arguments of functions and properties
那么如何解决这个问题呢?我研究了类型别名,但它们没有我想要的功能。
最佳答案
不,没有办法像Java那样像通配符那样做到这一点。这是不可能的,因为通配符不安全。
private Main(ControllerType controller, ControllerType controller2)
controller
和 controller2
被认为是相同的或继承的类型,但 Java 允许您使用通配符鸭式类型。
星形投影不是通配符替代品。星形投影是您在不知 Prop 体类型的情况下使用的,可以让您进行安全操作。
如果 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())
}
关于java - 使用通配符的 Kotlin 泛型自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46358070/
我是一名优秀的程序员,十分优秀!