内部类继承Kotlin

我正在尝试创建一个少数类的层次结构,每个类重写父类的内部类中的一些行为(特别是迭代器,但没关系)。 基本上,它看起来像这样:

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的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上的类型参数,但在SuperClass中的SuperClass.InnerClass 。 这是一个已知的问题: 捕获内部类的泛型:KT-9208 。

现在你可以做到以下几点:

 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 : SuperClass<T>.InnerClass() { override fun someOverridableLogic() { super.someOverridableLogic() println("some OTHER logic happened") } } } 

对于类似的例子和答案,另请参阅Kotlin中的Hadoop上下文类型参数 。