我是 Kotlin 的新手,正在尝试使用该语言编写一些项目。 我正在使用 Java 库并在我的项目中从该库扩展一个类,但我看到了这条错误消息。
'public' function exposes its 'public/*package*/' return type argument FooSettings
我了解问题所在,但我不确定如何在 Kotlin 中修复它,因为我仍在尝试熟悉 Kotlin。
我可以看到 Kotlin 很聪明,只尝试返回扩展 FooSettings
的类型。但是,问题是 FooSettings
仅是 package public,这意味着如果在我的 Kotlin 项目中,我将无法访问。
我对 Kotlin 泛型和 in
或 out
的使用做了一些研究,但我无法解决问题。
我可以在我的 Kotlin 项目中解决我看到的错误吗?
代码片段
这是 Java 库类的示例: 请注意,我无法更改库的实现。我必须使用这个库并在 Kotlin 中扩展它。
Java 库以这种方式编写并期望它被覆盖,这对我来说似乎很奇怪,但这是另一天的问题。
import java.util.Collections;
import java.util.List;
public abstract class ClassA {
public List<FooBuilder<?>> getBuilder(Foo foo) {
return Collections.emptyList();
}
}
public class Foo {
}
public abstract class FooBuilder<U extends FooBuilder.FooSettings> {
// implementation of Class
abstract static class FooSettings {
// implementation of Class
}
}
通常 Java 类会覆盖这样的方法:
import java.util.List;
public class MyJavaClassA extends ClassA {
@Override public List<FooBuilder<?>> getBuilder(final Foo foo) {
// implementation
}
}
但我正在尝试用 Kotlin 编写它看起来像:提醒这个 Kotlin 依赖于 Java 库并且无权访问包公共(public)类。
class MyKotlinClassA : ClassA() {
override fun getBuilder(foo: Foo): MutableList<FooBuilder<*>> {
// implementation
}
}
这会导致错误
'public' function exposes its 'public/*package*/' return type argument FooSettings
最佳答案
我认为“package public”是指“package private”?在您的示例中,FooBuilder.FooSettings
没有可见性修饰符,因此使用包私有(private)的 Java 默认值。假设这就是你的意思......
您将能够在您的 Kotlin 代码中访问包私有(private)类 FooSettings
,但前提是您将该 Kotlin 代码放在与 FooSettings
所在的包相匹配的包中> 已声明。
您仍然会遇到相同的编译错误,但这并不是因为您无法访问该类型:而是因为您正试图在比该类型的声明更可见的上下文中使用它。也就是说,您正在尝试采用包私有(private)类型并将其用作公共(public)方法签名的一部分,这是不允许的。要解决该问题,您需要将 Kotlin 类标记为 internal
。
可能还值得一提的是,Kotlin 的 internal
意味着它在那个模块 中可见,而不是在那个包 中。这一切都得到了更详细的解释 here .
关于java - Kotlin 错误 : 'public' function exposes its 'public/*package*/' return type argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53029320/