gpt4 book ai didi

java - 使用通配符的 Kotlin 泛型自定义类型

转载 作者:行者123 更新时间:2023-11-30 06:30:03 24 4
gpt4 key购买 nike

因此,在 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)

controllercontroller2 被认为是相同的或继承的类型,但 Java 允许您使用通配符鸭式类型。

星形投影不是通配符替代品。星形投影是您在不知 Prop 体类型的情况下使用的,可以让您进行安全操作。

如果 controllercontroller2 是两种不同的类型,那么您应该有两个通用参数。

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com