【问题标题】:Kotlin Error : 'public' function exposes its 'public/*package*/' return type argumentKotlin 错误:“public”函数暴露了它的“public/*package*/”返回类型参数
【发布时间】:2019-04-01 10:19:00
【问题描述】:

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

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

我知道问题是,但我不确定如何在 Kotlin 中解决它,因为我仍在尝试熟悉 Kotlin。 我可以看到 Kotlin 很聪明,只尝试返回扩展 FooSettings 的类型。但是问题是 FooSettings 仅是公共包,这意味着如果在我的 Kotlin 项目中,我无法访问。

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

我可以在我的 Kotlin 项目中做些什么来解决我看到的错误?

代码 sn-p

这是 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 库并且无法访问包公共类。

class MyKotlinClassA : ClassA() {
    override fun getBuilder(foo: Foo): MutableList<FooBuilder<*>> {
        // implementation
    }
}

这会导致错误

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

【问题讨论】:

    标签: java generics kotlin extends


    【解决方案1】:

    我猜你所说的“公共包”是指“私人包”?在您的示例中,FooBuilder.FooSettings 没有可见性修饰符,因此使用 Java 默认包私有。假设这就是你的意思......

    您将能够在 Kotlin 代码中访问包私有类 FooSettings,但前提是您将该 Kotlin 代码放在与声明 FooSettings 的包匹配的包中。

    您仍然会遇到相同的编译错误,但这并不是因为您无法访问该类型:而是因为您试图在比类型声明更可见的上下文中使用它。即您正在尝试采用包私有类型并将其用作公共方法签名的一部分,这是不允许的。要解决这个问题,您需要将 Kotlin 类标记为 internal

    还可能值得一提的是,Kotlin 的internal 意味着它在那个模块 中可见,而不是在那个 中。这一切都有更详细的解释here

    【讨论】:

    • 这真的很有帮助,谢谢。标记子类internal 也会解析public subclass exposes its public/*package*/ supertype [type name]
    【解决方案2】:

    在我的情况下,我收到此错误是因为我从另一个 java 文件中导入了一个 kotlin 类变量,该文件由于 Android Studio 从 java 到 kotlin 的自动转换而引发。

    我能够通过将 java 文件中变量的所有引用更改为它的 setter 和 getter 来修复它。

    例如:

    // kotlin file
    internal open class BubbleBaseLayout : FrameLayout {
        var windowManager: WindowManager? = null
        lateinit var viewParams: WindowManager.LayoutParams
        // defined here
        var layoutCoordinator: BubblesLayoutCoordinator? = null
        
        // ...
    }
    
    // Java file
        // This variable
        if (layoutCoordinator != null) { ... }
    

    需要改成

    // layoutCoordinator to getlayoutCoordinator everywhere
        if(getlayoutCoordinator() != null){ ... }
    

    【讨论】:

      【解决方案3】:

      如 phani Rithvij 所述。将所有依赖类转换为kotlin后将得到解决。

      【讨论】:

        猜你喜欢
        • 2019-07-31
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 2019-12-12
        • 2019-12-14
        • 2020-10-11
        相关资源
        最近更新 更多