【问题标题】:Cannot Access Class Using Java Language But Can Using Kotlin无法使用 Java 语言访问类,但可以使用 Kotlin
【发布时间】:2020-08-03 13:06:40
【问题描述】:

我遇到了有关访问抽象类的问题。

作为背景,我在一个公共模块中有一个抽象类。抽象类只是一些值的设置器/获取器。

abstract class BaseConfiguration {

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

通用模块由另一个模块使用,即 SDK。因此,在 gradle 中实现了这个通用模块。

分级

implementation project(":common")

在 SDK 模块内部,有一些公共接口允许设置/获取 BaseConfiguration 文件中的值。

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

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

梯度变化

api project(":common")

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

有谁知道为什么这在 Kotlin 中可以完美运行,但在 Java 中却不行?我究竟做错了什么?

补充说明: 当为 BaseConfiguration 类将 Kotlin 反编译为 Java 时,它显示所有内容都是公开的。

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 android gradle access-modifiers


    【解决方案1】:

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

    在 kotlin 中,默认是公开的。

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

    尝试明确类依赖:

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

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

    【讨论】:

    • 关于通过 kotlin 编译器查看已编译的 Java 类的好建议。那肯定会有所启发。在发帖之前,我尝试将 BaseConfiguration 公开。它不起作用,编译器抱怨添加修饰符。正如你所说,kotlin 默认是公开的。最终,我将 BaseConfiguration 提升到了 SDK 级别。但是感谢您的回复 +1
    • 您能否分享编译后的 java 类,因为我很想知道它为什么会这样。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多