我遇到有关抽象类访问的问题。
对于背景,我在一个通用模块中有一个抽象类。抽象类只是一些值的设置器/获取器。
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的类可见性是程序包私有的。这意味着同一包中的任何文件都可以访问您的抽象BaseConfiguration。
在kotlin中,默认值为public。
我想正是这种可见性导致了问题。如果应用模块未使用api,则不应将其用于通用模块。 Common的可见性仅应作为SDK的直接邻居公开给SDK模块。您没有将通用模块公开为应用程序模块的传递依赖项是正确的。
尝试明确说明类的依赖关系:
public abstract class BaseConfiguration {
abstract var key: String?
abstract var token: String?
}
我将看一下kotlin编译器编译的java类,并查看它是如何生成的。