我有这种情况:
有一个Java类

public class A {

    public void overrideMe(B param){
        //TODO: override me in Kotlin!
    }

    protected static class B {

    }
}

还有一个Kotlin类,它继承自该类,并且必须重写方法“overrideMe”
class K: A() {
    override fun overrideMe(param: B) {
        println("Wow!")
    }
}

但是Kotlin不允许这种行为。



有什么办法解决这个问题吗?

P.S.这不仅仅是一个综合案例-当我尝试实现自定义Spring AmqpAppender并覆盖它的postProcessMessageBeforeSend方法时,我遇到了这个问题。

最佳答案

在Kotlin中没有无法解决此,这是原因:

所不同的是,protected实际上在Kotlin中与Java中的含义有所不同。

Kotlin中的protected表示:



Java中的protected表示:



有了这些知识,问题应该很清楚了,Kotlin中的protected static class B更像Java中的private static class B。因此,警告是正确的。

Kotlin-Java Interop指南特别指出:



结论:

这意味着Kotlin会将Java-protected解释为好像是Kotlin- protected ergo,无法按原样在Kotlin中实现class K。要使它起作用,您必须要做的最少的工作就是创建C extends A(在Java中),该文件处理B的所有公共(public)访问,然后在Kotlin中扩展此类。像本期Calling protected static methods

罪魁祸首:

主要问题是static nested classes的Java行为,即



这种方便的行为首先会产生问题。

边注:

可能与Java protected更好的匹配是Kotlins internal,它提供了更好的封装级别。

10-01 04:03
查看更多