Не могу получить доступ к классу, используя Java язык, но могу использовать Kotlin - PullRequest
0 голосов
/ 21 апреля 2020

У меня проблема с доступом к абстрактному классу.

Для фона у меня есть абстрактный класс в общем модуле. Абстрактный класс - это просто setters / getters для некоторых значений.

abstract class BaseConfiguration {

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

Общий модуль используется другим модулем, который является SDK. Таким образом, в Gradle реализован этот общий модуль.

Gradle

implementation project(":common")

Внутри модуля SDK есть публичные c интерфейсы, позволяющие устанавливать / получать значения в Файл BaseConfiguration.

Конфликт, с которым я сталкиваюсь, заключается в том, что для Kotlin все работает нормально. Я могу создать проект, затем добавить SDK в качестве зависимости и затем установить значения для BaseConfiguration через предоставленные интерфейсы в SDK.

Однако, когда я пытаюсь использовать язык Java, я получаю сообщение об ошибке «Не удается получить доступ к BaseConfiguration». Единственное, что, по-видимому, решает эту проблему, - это обновить мой Grak SDK до api.

Изменения Gradle

api project(":common")

У меня есть проблемы с этим изменением, поскольку предполагается, что общий модуль внутренний и используется только в SDK. Уровень приложения не должен иметь к нему доступа. Приложение должно получать доступ только к предоставленным интерфейсам с помощью SDK.

Кто-нибудь знает, почему это прекрасно работает с Kotlin, но не с Java? Что я делаю неправильно?

Дополнительные примечания: при декомпиляции от Kotlin до Java для класса BaseConfiguration это показывает, что все опубликовано c.

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);
}

1 Ответ

1 голос
/ 21 апреля 2020

По умолчанию видимость класса java является частным пакетом. Это означает, что любой файл в том же пакете может получить доступ к вашей абстрактной BaseConfiguration.

В kotlin значением по умолчанию является publi c.

Я полагаю, именно эта видимость вызывает проблему. Вы не должны использовать API для общего модуля, если модуль приложения не использует его. Видимость Common должна быть открыта только для модуля SDK как его прямого соседа. Вы правы, что не выставляете общий модуль как транзитивную зависимость модуля приложения.

Попытка получить явное представление о зависимости класса:

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

Я бы посмотрел на скомпилированный java класс компилятором kotlin и посмотрите, как он его генерирует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...