在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协变,否则,你的方法是正确的。