使用公共方法继承Java类,接受Kotlin中的受保护类

时间:2018-03-14 17:23:29

标签: java inheritance kotlin protected kotlin-interop

我遇到这种情况: 有一个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。这不仅仅是一个综合案例 - 当我尝试实现自定义This is the output 并覆盖它的postProcessMessageBeforeSend方法时,我遇到了这个问题。

2 个答案:

答案 0 :(得分:2)

Kotlin中有无法解决此问题,原因如下:

不同之处在于protected实际上意味着Kotlin中的某些东西与Java中的东西略有不同。

Kotlin中的

protected表示:

  

kotlin protected:与private相同(在包含声明的文件中可见)+在子类中也可见;

Java中的

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的开发人员而言)。