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

标签 java generics kotlin interop

我可以在 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/

相关文章:

java - 如何使 JRadioButtons 更改属性(JFrame)?

Java:强制组件填满 GridLayout 中的整行

java - xyz 不在类型变量 T 的范围内

java - 在 Java 中实例化一个泛型类

c# - 内部类泛型类型与外部类型相同

kotlin - kotlin 协程是否有带定时器的异步调用?

java - 带参数的 Elasticsearch java HighLevel 客户端更新脚本

java - 从 ArrayList Java 处理 Boid 示例中删除元素

kotlin - 如何使用 Google 代码风格在 Android (Kotlin) 中声明变量?

generics - 处理惯用函数链中的空列表