在 Kotlin 中实例化一个使用递归泛型的具体 Java class

Instantiate a concrete Java class that uses recursive generics in Kotlin

我可以在 Kotlin 中实例化一个使用递归泛型的具体 Java class 吗?如果可以,那么如何?

详情

我正在尝试实例化一个 Java class,它使用类似于下面示例的递归泛型。我找到了将 Java class 包装在新的 class 中的解决方法,但这感觉就像我在回避一个我应该能够直接处理的问题。

Java Class 使用递归泛型

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?

不,你不能。 问题与方差有关。

这个Javaclass:

public class MyLegacyClass<T extends MyLegacyClass<T>> {}

等于这个 Kotlin class:

class MyLegacyClass<T : MyLegacyClass<T>>

即其参数T不变。您需要一个 covariant 类型,因此,在这种情况下:

class MyLegacyClass<out T : MyLegacyClass<T>>

但是由于 Java 互操作性,如果不创建新的 Kotlin class,你 不能 这样做。

如果可能的话,我会将 class MyLegacyClass 的参数 T 移动到 Kotlin 协变,否则,您的方法是正确的。