我遇到这种情况: 有一个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不允许这种行为。
'public'函数公开其'protected(in A)'参数类型B
有什么方法可以解决这个问题吗?
P.S。这不仅仅是一个综合案例 - 当我尝试实现自定义并覆盖它的postProcessMessageBeforeSend方法时,我遇到了这个问题。
答案 0 :(得分:2)
Kotlin中有无法解决此问题,原因如下:
不同之处在于protected
实际上意味着Kotlin中的某些东西与Java中的东西略有不同。
protected
表示:
Java中的kotlin protected:与private相同(在包含声明的文件中可见)+在子类中也可见;
protected
表示:
java protected :成员只能在自己的包中访问(与package-private一样),此外,还可以在另一个包中通过其类的子类访问。
有了这些知识,问题应该很清楚,Kotlin中的protected static class B
更像是Java中的private static class B
。因此警告是正确的。
Kotlin-Java Interop指南明确指出:
protected
仍为protected
(请注意,Java允许从同一个包中的其他类访问受保护的成员,而Kotlin则不允许,因此 Java类将具有更广泛的代码访问权限强>);
<强>结论:强>
这意味着Kotlin将Java-protected
解释为好像是Kotlin - protected
ergo无法在Kotlin中实现class K
。您必须做的最少的工作是创建C extends A
(在Java中),它处理B
的所有公共访问,然后在Kotlin中扩展此类。就像这个问题Calling protected static methods
罪魁祸首:
主要问题是static nested classes的Javas行为,
与其他类(和其他类)的实例成员交互,就像任何其他顶级类一样。 实际上,静态嵌套类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包。
此方便的行为首先会产生问题。
旁注:
可能与Java更好的匹配 - protected
是Kotlins internal
,它提供了更好的封装级别。
kotlin internal:此模块中看到声明类的任何客户端都会看到其内部成员;
答案 1 :(得分:0)
嗯,毕竟,结论是:在纯Kotlin中无法解决这种情况。
我希望AmqpAppender.Event将在不久的将来公开。
即使Java允许这种行为,在公共方法中使用无公共参数对我来说似乎也是一个糟糕的设计(对于Kotlin的开发人员而言)。