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