Kotlin 错误:'public' 函数公开其 'public/*package*/' 返回类型参数

2022-09-03 06:12:06

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

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

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

我做了一些关于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库,并且无法访问包公共类。

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

这会导致错误

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

答案 1

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

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

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

还值得一提的是,对于Kotlin来说,这意味着它在那个模块中是可见的,而不是在那个里。这里将对此进行更详细的解释。internal


答案 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){ ... }

推荐