我正在尝试创建几个类的层次结构,每个类都覆盖其父类内部类(具体来说是迭代器)的某些行为。基本上,它看起来像这样:
open class SuperClass<T>{
protected open inner class InnerClass{
fun someLogic(){
println("some logic happened")
}
open fun someOverridableLogic(){
println("some logic happened")
}
}
}
class ChildClass<T> : SuperClass<T>(){
protected inner class ChildInnerClass:InnerClass{
override fun someOverridableLogic(){
super.someOverridableLogic()
println("some OTHER logic happened")
}
}
}
编译器拒绝处理此代码,因为 ChildInnerClass 继承 InnerClass 时需要类型参数。然而,只要像这样添加参数:
protected inner class ChildInnerClass:InnerClass<T>
编译器突然不再需要任何类型参数!
Java的等效代码可以正常编译和执行,而且不需要类型参数:
public class SuperClass<T> {
protected class InnerClass{
public void someLogic(){
System.out.println("some logic happened");
}
public void someOverridableLogic(){
System.out.println("some logic happened");
}
}
}
public class ChildClass<T> extends SuperClass<T>{
protected class ChildInnerClass extends InnerClass{
@Override
public void someOverridableLogic() {
super.someOverridableLogic();
System.out.println("some OTHER logic happened");
}
}
}
那么,我在 Kotlin 中做错了什么,还是有一些语言限制我不知道的吗?
InnerClass
上添加类型参数,所以最终变成了inner class ChildInnerClass : SuperClass<T>.InnerClass<T>()
,我认为这就是链接答案建议做的事情... 我有什么遗漏吗? - Augustoprotected open inner class InnerClass<T>
时,才需要在InnerClass
上指定类型参数。在此代码中,InnerClass
不需要类型参数,而是从其父类SuperClass
中使用 T。 - EiGInnerClass
等进行了一些更改。为了清晰起见,我已经更新了答案中的代码,包括SuperClass
声明。您应该能够将示例复制并粘贴到新的 Kotlin 文件中,而且不应该出现任何问题。如果有问题,请告诉我们。 - mfulton26SuperClass.InnerClass
加上了<T>
。谢谢你澄清了这一点!!! - Augusto