内部类在Kotlin中的继承

EiG*_*EiG 6 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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器拒绝使用此代码,当ChildInnerClass继承它时期望InnerClass上的类型参数.但是,在添加如下参数后:

protected inner class ChildInnerClass:InnerClass<T>
Run Code Online (Sandbox Code Playgroud)

编译器突然不期待任何类型参数!

相当于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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,我在Kotlin做错了什么,还是仅仅是我不知道的语言限制?

mfu*_*n26 5

编译器是不是在期待一个类型参数InnerClass,但对SuperClassSuperClass.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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有关类似示例和答案,另请参阅Kotlin中的Hadoop上下文类型参数.