Intereting Posts
Общий параметр Котлина с использованием функции Карта Котлина с использованием операторов Ошибка: ошибка преобразования байт-кода в dex: Причина: com.android.dex.DexException: несколько файлов dex определяют Lorg / jetbrains / anko / collections / CollectionsKt; Явный аргумент типа Kotlin и RxJava kotlin android начать новую услугу Почему «как» в Котлине не бросили в этом случае Синтетическое расширение Kotlin и несколько включают в себя одну и ту же компоновку Что такое синтаксис класса <? extends class_name> в kotlin? Как отличить глобальную переменную от локального с тем же именем в Kotlin? Предупреждение компилятора при использовании аннотации @Value в проекте Kotlin Панель «Призрачная» нижняя панель навигации, когда фрагмент загружается в домашней деятельности Как расширить статические поля Java в kotlin Класс Mock Kotlin в модульном тестировании Java Запустить Java в Kotlin-конвертер из командной строки? Параметр типа Ketlin reified как параметр функции

Модификаторы видимости kotlin не совпадают

введите описание изображения здесь

Об этом говорится в официальном документе. Но когда я делаю что-то вроде этого:

var human : Human? = null 

и декомпилировать его в java-код, я считаю, что на самом деле это было

 @Nullable private Human human; 

и бесполезно писать это

 public var human : Human? = null 

но когда я пишу это:

 lateinit var human : Human 

он станет общедоступным на этот раз

 @NotNull public Human human; 

это была большая проблема, когда я использую Dagger2

в Dagger2 вводимое свойство должно быть общедоступным, но если я напишу var human : Human? = null var human : Human? = null он не сможет построить.

так, это ошибка kotlin ? или ошибка официальной документации?

  1. «Видимость по умолчанию является public » означает, что если вы не укажете видимость, это то же самое, что и указание public .

  2. Свойство соответствует методам getter и setter ( getHuman() и setHuman() ) в декомпилированном коде, а не в полевом human .

  3. Документация говорит о видимости от Kotlin , которая не такая же, как видимость в соответствии с JVM (и быть не может, потому что JVM не имеет internal видимости). Видимость JVM – это просто детали реализации (насколько это касается документации).

Из 2 и 3 вместе, цитированная документация абсолютно ничего не говорит о существовании поля поддержки, не обращая внимания на его видимость, о чем заботится Кинжал. Вместо этого он задокументирован в https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html :

  1. В первом разделе «Свойства»:

    Закрытое поле с тем же именем, что и имя свойства (только для свойств с полями поддержки).

  2. В «Полях экземпляра»:

    Если вам нужно открыть свойство Kotlin в качестве поля в Java, вам необходимо аннотировать его с помощью аннотации @JvmField. Поле будет иметь такую ​​же видимость, что и базовое свойство.

    а также

    Свойства поздней инициализации также отображаются как поля. Наглядность поля будет такой же, как и видимость сетчатого активатора lateinit .

в Dagger2 i вводимое свойство должно быть частным

Ты уверен? AFAIK поле должно быть public , а lateinit var human: Human должен быть в порядке.

Я сама лечу свою проблему.

На самом деле, то, что означает общественность общества, является частным + геттер и сеттер, частный – у jsut private нет геттера и сеттера. Официальный документ не объяснил это четко.

Итак, добавьте некоторые объяснения в главе Calling Kotlin from Java это означает, что если вы хотите, чтобы ваши свойства были общедоступными, вы можете использовать @JvmField или lateinit var

Это моя вина, я не читал документ осторожно