在Kotlin中实例化一个使用递归泛型的具体Java类
我可以在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() }
我可以实例化一个在Kotlin中使用递归泛型的具体Java类吗? 如果是的话那怎么样?
不,你不能 。 问题与差异有关。
这个Java类:
public class MyLegacyClass<T extends MyLegacyClass<T>> {}
等于这个Kotlin类:
class MyLegacyClass<T : MyLegacyClass<T>>
在参数T
中是不变的 。 你将需要一个协变类型,所以在这种情况下:
class MyLegacyClass<out T : MyLegacyClass<T>>
但是,由于Java的互操作性,如果不创建一个新的Kotlin类, 就无法做到这一点。
如果可能的话,我会把类MyLegacyClass
移到参数T
Kotlin协变,否则,你的方法是正确的。