gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:42:18 33 4
gpt4 key购买 nike

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

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com