我可以在 Kotlin 中实例化一个使用递归泛型的具体 Java 类吗?如果可以,那么如何?
详情
我正在尝试实例化一个使用递归泛型的 Java 类,类似于下面的示例。我找到了一种将 Java 类包装在一个新类中的解决方法,但这感觉就像我在回避一个我应该能够直接处理的问题。
具有递归泛型的 Java 类
public class MyLegacyClass<T extends MyLegacyClass<T>> {
// implementation ...
}
它是如何在 Java 中实例化的
// In Java we just ignore the generic type...
MyLegacyClass myLegacyClass = new MyLegacyClass();
在 Kotlin 中实例化的尝试失败
class myClass {
// Error: One type argument expected for class...
val x: MyLegacyClass = MyLegacyClass()
// Still 'Error: One type argument expected for class..' You start to see the problem here.
val y: MyLegacyClass<MyLegacyClass<MyLegacyClass<MyLegacyClass>>> = MyLegacyClass()
}
Kotlin 解决方法
class MyLegacyClassWrapper : MyLegacyClass<MyLegacyClassWrapper>()
class myClass {
val x: MyLegacyClass<MyLegacyClassWrapper> = MyLegacyClassWrapper()
}
最佳答案
Can I instantiate a concrete Java class that uses recursive generics in Kotlin? if so then how?
不,你不能。 这个问题与方差有关。
这个 Java 类:
public class MyLegacyClass<T extends MyLegacyClass<T>> {}
等于这个 Kotlin 类:
class MyLegacyClass<T : MyLegacyClass<T>>
即在其参数T
中不变。你需要一个 covariant 类型,所以,在这种情况下:
class MyLegacyClass<out T : MyLegacyClass<T>>
但由于 Java 的互操作性,您无法在不创建新的 Kotlin 类的情况下做到这一点。
如果可能,我会将类 MyLegacyClass
移动到其参数 T
中的 Kotlin 协变,否则,您的方法是正确的。
关于java - 在 Kotlin 中实例化一个使用递归泛型的具体 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46758572/