java - Kotlin 错误 : 'public' function exposes its 'public/*package*/' return type argument

标签 java generics kotlin extends

我是 Kotlin 的新手,正在尝试使用该语言编写一些项目。 我正在使用 Java 库并在我的项目中从该库扩展一个类,但我看到了这条错误消息。

'public' function exposes its 'public/*package*/' return type argument FooSettings

我了解问题所在,但我不确定如何在 Kotlin 中修复它,因为我仍在尝试熟悉 Kotlin。 我可以看到 Kotlin 很聪明,只尝试返回扩展 FooSettings 的类型。但是,问题是 FooSettings 仅是 package public,这意味着如果在我的 Kotlin 项目中,我将无法访问。

我对 Kotlin 泛型和 inout 的使用做了一些研究,但我无法解决问题。

我可以在我的 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/

相关文章:

java - 当属性是通用属性时,使用 xstream 将 XML 反序列化为对象

c# generic Delegate Error Cannot bind to the target method 因为它的签名

kotlin - 如何在 Kotlin 中使用 volatile

java - 从 Tablayout Fragment ( Android) 实现接口(interface)

java - 在 Java 中存储 Web 爬虫的 URI 的最有效的数据结构

java - 如何在 apache spark 中执行词干提取?

android - Android Gradle插件仅支持Kotlin Gradle插件1.3.10及更高版本

java - Wildfly 无法注入(inject)值(value)?

c# - 无法将类型 'System.Collections.Generic.List<website.Class1>' 转换为 'System.Collections.Generic.List<library.Class1>'

kotlin - 如何在Kotlin中评估由String表示的 bool 表达式?