无法使用 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,看看它是如何生成的。
我遇到有关访问摘要的问题 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,看看它是如何生成的。