Краткий ответ: из Java вы сможете использовать getCount()
(и setCount()
) вместо count
.
Длинный ответ:
Это результат того, как Kotlin обрабатывает свойства.
В Java поля (переменные-члены) могут иметь любую область видимости. Но на практике, делая их общедоступными, вы не можете контролировать доступ к ним или их изменение, поэтому обычным способом является сохранение их приватности и использование методов доступа (get()
и, если доступно для записи, set()
).
Поскольку этот шаблон настолько распространен и многословен, Котлин позаботится об этом за вас. Свойства Kotlin выглядят как поля, но (в Kotlin / JVM) они реализованы с закрытыми полями и автоматически генерируемыми методами доступа с соответствующей областью действия. Когда вы используете это поле, Kotlin автоматически вызывает соответствующий метод доступа.
Если вы пишете чистый котлин, все это скрыто, и вам не нужно об этом беспокоиться. Но этот вопрос иллюстрирует, как это может вызвать сюрпризы, когда вы смешиваете Java и Kotlin!
К счастью, обходной путь обычно достаточно прост. В этом случае Parent
определяет свойство protected var count: Int = 0
. Полученный байт-код будет иметь приватное поле с именем count
и защищенные getCount()
и setCount()
методы. Таким образом, вы можете получить желаемый эффект, вызывая эти методы. (Конечно, это то, что вы обычно делаете в Java).
Есть несколько угловых случаев, когда это не так просто (например, если вы расширяете класс, который уже определяет метод, конфликтующий со средством доступа), но это довольно редко.