无法使用 Java 语言访问 Class 但可以使用 Kotlin

Cannot Access Class Using Java Language But Can Using Kotlin

我遇到有关访问摘要的问题 class。

作为背景,我在公共模块中有一个摘要 class。对于某些值,摘要 class 只是 setters/getters。

abstract class BaseConfiguration {

    abstract var key: String?
    abstract var token: String?
}

公共模块被另一个SDK模块使用。所以,在gradle中实现了这个通用模块。

Gradle

implementation project(":common")

在 SDK 模块内部,有 public 接口允许 setting/getting BaseConfiguration 文件中的值。

我 运行 的冲突是 Kotlin 一切正常。我可以创建一个项目,然后将 SDK 添加为依赖项,然后通过 SDK 中提供的接口为 BaseConfiguration 设置值。

但是,当我尝试使用 Java 语言时,我收到 "cannot access BaseConfiguration" 错误。似乎可以解决此问题的唯一方法是将我的 SDK gradle 更新为 api。

Gradle 变化

api project(":common")

我对这一变化感到担忧,因为公共模块应该是内部的,只能由 SDK 使用。应用级别不应访问它。应用只能访问SDK提供的接口。

有谁知道为什么这与 Kotlin 完美兼容,但与 Java 不兼容?我究竟做错了什么?

进一步说明: 当为 BaseConfiguration class 将 Kotlin 反编译为 Java 时,它表明一切都是 public.

public abstract class BaseConfiguration {
   @Nullable
   public abstract String getKey();

   public abstract void setKey(@Nullable String var1);

   @Nullable
   public abstract String getToken();

   public abstract void setToken(@Nullable String var1);
}

默认情况下,java 的 class 可见性是包私有的。这意味着同一包中的任何文件都可以访问您的抽象 BaseConfiguration。

在kotlin中,默认是public。

我想是这种可见性导致了问题。如果应用程序模块未使用它,则不应将 api 用于公共模块。 Common 的可见性应该只暴露给作为其直接邻居的 SDK 模块。您不将公共模块公开为应用程序模块的传递依赖项是正确的。

尝试明确说明 class 依赖项:

public abstract class BaseConfiguration {
    abstract var key: String?
    abstract var token: String?
}

我会看一下 kotlin 编译器编译的 java class,看看它是如何生成的。