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

问题描述 投票:0回答:1

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

对于背景,我在一个通用模块中有一个抽象类。抽象类只是一些值的设置器/获取器。

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个回答
1
投票

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

在kotlin中,默认值为public。

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

尝试明确说明类的依赖关系:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.