gpt4 book ai didi

java - 使用接受 Kotlin 中 protected 类的公共(public)方法从 Java 类继承

转载 作者:IT老高 更新时间:2023-10-28 13:40:42 24 4
gpt4 key购买 nike

我有这种情况:有一个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' function exposes its 'protected (in A)' parameter type B

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

附:这不仅仅是一个综合案例——我在尝试实现自定义 Spring AmqpAppender 时遇到了这个问题。并覆盖它的 postProcessMessageBeforeSend 方法。

最佳答案

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

不同之处在于,protected 实际上在 Kotlin 中的含义与在 Java 中略有不同。

Kotlin 中的

protected 意思是:

kotlin protected: same as private (visible inside the file containing the declaration) + visible in subclasses too;

Java 中的

protected 意思是:

java protected: the member can only be accessed within its own package (as with package-private) and, in addition, by a subclass of its class in another package.

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

Kotlin-Java Interop指南特别指出:

protected remains protected (note that Java allows accessing protected members from other classes in the same package and Kotlin doesn't, so Java classes will have broader access to the code);

结论:

这意味着 Kotlin 将 Java-protected 解释为好像它是 Kotlin-protected 那样,因此无法实现 class K 在 Kotlin 中。要使其正常工作,您至少必须创建 C extends A(在 Java 中)来处理 B 的所有公共(public)访问,然后在 Kotlin 中扩展此类。就像本期 Calling protected static methods

罪魁祸首:

主要问题是 static nested classes 的 Java 行为。 , 其中

interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience.

这种方便的行为首先造成了问题。

旁注:

可能更适合 Java-protected 的是 Kotlins internal,它提供了更好的封装级别。

kotlin internal: any client inside this module who sees the declaring class sees its internal members;

关于java - 使用接受 Kotlin 中 protected 类的公共(public)方法从 Java 类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49284094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com