Модификаторы видимости 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

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

Intereting Posts
Kotlin switch-statement с более чем двумя переменными? Kotlin – Как рекурсивно назвать лямбда-функцию Аргумент типа не распознан в Котлине Ошибка виртуального метода при использовании Parceler в Kotlin Android В библиотеке Injekt для Kotlin, как мне создать локальные области, например, для каждой активности Android? Как обновить kotlin-js-library до 1.1.3, как это было с kotlin-gradle-plugin? Как я могу делегировать реализацию изменчивому свойству в Котлин? spring.config.location не работает на Spring Boot 2.0.0 M6 Производит ли вызов Kotlin метод вызова метода Контрактное тестирование DSL неправильное поведение / ошибка Может ли перегрузка операторов сравнения в Kotlin использоваться для реализации SQL-подобных функций? Kotlin и WebSockets Параметр, заданный как ненулевой, равен null в массиве ArrayAdaper Kotlin: ошибка синхронизации градиента в Android Studio Kotlin getParcelableArray из комплекта намерений не может передать его пользовательскому типу