我有这种情况:
有一个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
,它提供了更好的封装级别。