Понимание модификаторов доступа Kotlin - PullRequest
0 голосов
/ 29 марта 2019

У меня есть дочерний класс в java, родительский класс в kotlin и класс SuperParent в Java, у меня проблема с доступом к полю класса Kotlin, он показывает ошибку Ошибка: (11, 28) java: count has hasличный доступ в Parent Вот код:

     public class Child extends Parent {
            public static void main(String[] args) {
                Child child = new Child();
                child.getParentCount();
            }

            private void getParentCount() {
    **//here error comes (Error:(11, 28) java: count has private access in Parent)**
                System.out.println(***count***);
            }
        }

        open class Parent : SuperParent() {
            protected var count: Int =0
            init {
    // but this works properly , if I remove the error in child class
                println(superCount)
            }

        }

        public class SuperParent {
            protected int superCount = 5;

            public SuperParent() {
// this also prints properly on removing error
                System.out.println(superCount);
            }
        }

1 Ответ

3 голосов
/ 29 марта 2019

Краткий ответ: из Java вы сможете использовать getCount()setCount()) вместо count.

Длинный ответ:

Это результат того, как Kotlin обрабатывает свойства.

В Java поля (переменные-члены) могут иметь любую область видимости. Но на практике, делая их общедоступными, вы не можете контролировать доступ к ним или их изменение, поэтому обычным способом является сохранение их приватности и использование методов доступа (get() и, если доступно для записи, set()).

Поскольку этот шаблон настолько распространен и многословен, Котлин позаботится об этом за вас. Свойства Kotlin выглядят как поля, но (в Kotlin / JVM) они реализованы с закрытыми полями и автоматически генерируемыми методами доступа с соответствующей областью действия. Когда вы используете это поле, Kotlin автоматически вызывает соответствующий метод доступа.

Если вы пишете чистый котлин, все это скрыто, и вам не нужно об этом беспокоиться. Но этот вопрос иллюстрирует, как это может вызвать сюрпризы, когда вы смешиваете Java и Kotlin!

К счастью, обходной путь обычно достаточно прост. В этом случае Parent определяет свойство protected var count: Int = 0. Полученный байт-код будет иметь приватное поле с именем count и защищенные getCount() и setCount() методы. Таким образом, вы можете получить желаемый эффект, вызывая эти методы. (Конечно, это то, что вы обычно делаете в Java).

Есть несколько угловых случаев, когда это не так просто (например, если вы расширяете класс, который уже определяет метод, конфликтующий со средством доступа), но это довольно редко.

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