Kotlin vs Java嵌套泛型

Kotlin vs Java嵌套泛型,java,android,generics,kotlin,Java,Android,Generics,Kotlin,我在尝试将带有嵌套泛型的Java代码转换为Kotlin时遇到了一些问题。以Java SSCCE为例(请注意S和T之间的关系): 公共类JavaTest{ 私有类JavaObjectContainer{ 公共部门的obj; } 私有抽象类JavaSampleClass{ 私人阶级类型; 公共JavaSampleClass(类类型){ this.type=type; } 公共类getType(){ 返回类型; } 公开摘要和方法; } 私有类JavaChildSampleClass扩展了JavaSa

我在尝试将带有嵌套泛型的Java代码转换为Kotlin时遇到了一些问题。以Java SSCCE为例(请注意S和T之间的关系):

公共类JavaTest{
私有类JavaObjectContainer{
公共部门的obj;
}
私有抽象类JavaSampleClass{
私人阶级类型;
公共JavaSampleClass(类类型){
this.type=type;
}
公共类getType(){
返回类型;
}
公开摘要和方法;
}
私有类JavaChildSampleClass扩展了JavaSampleClass{
公共JavaChildSampleClass(){
super(String.class);
}
@凌驾
公共void调用方法(字符串s){}
}
私有类JavaTestContainer{
私人地图
由于Kotlin不提供通配符的替代方案

我一直在考虑将sampleClasses映射声明为

MutableMap<*, *>
MutableMap<*, *>

在Java中不需要强制转换
callMethod
的唯一原因是您使用的是原始类型(正如Turing85的评论所提到的)编译器基本上放弃了类型检查。

可能不相关,但仍然有一种代码味道:。如果我没有弄错的话,使用原始类型基本上就是这种方法在Java中如此强大的原因。我已经为一个多类型RecyclerView.Adapter实现了一些类似的东西。只是需要谨慎,并添加一层保护ion确保您正在尝试访问一个已添加的工厂。无论如何,我将研究您的观察结果,谢谢!非常感谢!您一针见血。如果需要,我将尽最大努力重构代码以避免原始类型(并了解如何在Kotlin中注意到它们)您不需要在Kotlin中注意到它们,因为Kotlin不支持它们。困难的部分是在Java中注意到它们。
Type mismatch.
Required: KotlinTest.KotlinSampleClass<Any, KotlinObjectContainer<Any>>
Found: KotlinTest.KotlinChildSampleClass
MutableMap<*, *>
MutableMap<*, *>
private val sampleClasses: MutableMap<Class<*>, KotlinSampleClass<*, *>> = mutableMapOf()

fun registerKotlinSampleClass(kotlinSampleClass: KotlinSampleClass<*, *>) {
    sampleClasses.put(kotlinSampleClass.type, kotlinSampleClass)
}

@Suppress("UNCHECKED_CAST")
fun callMethod(obj : Any) {
    (sampleClasses[obj.javaClass] as KotlinSampleClass<Any, *>?)?.callMethod(obj)
}