gpt4 book ai didi

java - 无法使用 Java 语言访问类,但可以使用 Kotlin 访问类

转载 作者:行者123 更新时间:2023-12-02 08:41:53 25 4
gpt4 key购买 nike

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

作为背景,我在公共(public)模块中有一个抽象类。抽象类只是某些值的 setter / getter 。

abstract class BaseConfiguration {

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

公共(public)模块由另一个模块(即 SDK)使用。这样,在gradle中就实现了这个公共(public)模块。

Gradle

implementation project(":common")

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

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

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

等级变化

api project(":common")

我对这一更改感到担忧,因为公共(public)模块应该是内部的并且仅由 SDK 使用。应用程序级别不应有权访问它。应用程序只能访问 SDK 提供的接口(interface)。

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

进一步说明:当将 BaseConfiguration 类的 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的类可见性是包私有(private)的。这意味着同一包中的任何文件都可以访问您的抽象 BaseConfiguration。

在 kotlin 中,默认是 public。

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

尝试明确类依赖性:

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

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

关于java - 无法使用 Java 语言访问类,但可以使用 Kotlin 访问类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61332469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com