【问题标题】:Inner classes Inheritance in KotlinKotlin 中的内部类继承
【发布时间】:2016-02-26 12:32:11
【问题描述】:

我正在尝试创建几个类的层次结构,每个类都覆盖其父级内部类中的某些行为(特别是迭代器,但没关系)。基本上,它看起来像这样:

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 中做错了什么,还是仅仅是我不知道的语言限制?

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    编译器不希望 InnerClass 上的类型参数,而是 SuperClass.InnerClass 中的 SuperClass 上的类型参数。这是一个已知问题:Capture generics in inner classes : 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")
            }
        }
    }
    

    有关类似示例和答案,另请参阅 Hadoop Context type parameters in Kotlin

    【讨论】:

    • 由于我是 Kotlin 的新手,因此提出了一个问题:我正在努力解决这个问题,但答案中的代码无法为我编译。我也必须在InnerClass 上添加类型参数,所以它最终成为inner class ChildInnerClass : SuperClass&lt;T&gt;.InnerClass&lt;T&gt;(),我认为这是链接答案建议做的......我错过了什么吗?
    • 只有在使用类型参数 (protected open inner class InnerClass&lt;T&gt;) 定义 InnerClass 时才需要在 InnerClass 上指定类型参数 在此代码中 InnerClass 不需要类型参数,而是使用其父级中的 T , SuperClass
    • @Augusto 如果答案中的代码无法为您编译,那么我猜您对InnerClass 等进行了一些更改。因此,为了清楚起见,我已经更新了代码包含SuperClass 声明的答案。您应该能够将示例复制并粘贴到新的 Kotlin 文件中,并且它应该可以毫无问题地编译。如果不适合您,请告诉我们。
    • 傻我!我在玩代码时的某个时候将&lt;T&gt; 添加到SuperClass.InnerClass。感谢您澄清这一点!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多