Как ссылаться на тип объекта Kotlin в Java?

У меня есть объект Kotlin, как показано ниже:

object TestObject {
    val name: String = "Hi"
}

Как бы я назвал TestObject в Java? Код ниже не понимает TestObject.name:

public class Main {
    public static void main(String[] args) {
        System.out.println(TestObject.name);
    }
}

вам нужно создать экземпляр TestObject (т.е. new TestObject().name) - если свойство name не является public static, тогда вы можете ссылаться на TestObject.name

blurfus 24.04.2019 23:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь происходят две вещи, обе связанные с тем, как Kotlin/JVM генерирует байт-код Java. (Это детали реализации, которые не видны из другого кода Kotlin, но становятся очевидными при доступе к ним из Java.)

  • Одноэлементный объект транслируется в класс, а его единственный экземпляр сохраняется в поле этого объекта с именем INSTANCE.

  • Свойство Kotlin состоит из методов доступа (геттер и, если он доступен для записи, сеттер) и (при необходимости) вспомогательного поля. Они переводятся в закрытое поле, а методы с соответствующей видимостью именуются обычным способом (getField() и setField() или isField() и setField(), если свойство вызывается isField).

Собрав это вместе, вы можете ссылаться на свойство в вопросе из кода Java как:

TestObject.INSTANCE.getName()

(Полная информация о том, как получить доступ к Kotlin из Java, находится в здесь.)

@ochi: Да, Kotlin генерирует аксессор(ы) и резервное поле по мере необходимости. (По крайней мере, Kotlin/JVM имеет; я не знаю о других платформах.) Строго говоря, свойство является является геттером (и, если присутствует, сеттером) — у большинства свойств также есть резервное поле, но у вас его нет. иметь его, если вы переопределяете аксессор(ы). (Именно так работают свойства расширения.) Конечно, синтаксис Kotlin создает впечатление, что вы обращаетесь к полю напрямую, но это не так; Java об этом не знает, так что там более очевидно.

gidds 25.04.2019 00:28
TestObject.INSTANCE это то, что я ищу. Большое спасибо!
Xi Wei 25.04.2019 15:45

Другие вопросы по теме