Доступ к статическому внутреннему классу, определенному в Java, через производный класс - PullRequest
5 голосов
/ 30 апреля 2019

У меня есть некоторые классы, определенные в Java, похожие на код ниже. Я пытаюсь получить доступ к SomeValue через производный класс Java, который разрешен в Java, но не в Kotlin.

Есть ли способ получить доступ к полю через производный класс?

// java file
// -------------------------------------------------

class MyBaseClass {
    public static final class MyInnerClass
    {
        public static int SomeValue = 42;
    }
}

final class MyDerivedClass extends MyBaseClass {
}

// kotlin file
// -------------------------------------------------

val baseAccess = MyBaseClass.MyInnerClass.SomeValue;
// this compiles

val derivedAccess = MyDerivedClass.MyInnerClass.SomeValue;
//                                 ^ compile error: Unresolved reference: MyInnerClass

1 Ответ

1 голос
/ 30 апреля 2019

В Kotlin вложенные типы и сопутствующие объекты не наследуются автоматически.

Это поведение не относится к Java, вы можете воспроизвести такое же поведение только в Kotlin:

open class Base {
    class Nested
}

class Derived : Base()

val base = Base.Nested::class        // OK
val derived = Derived.Nested::class  // Error: 'Nested' unresolved

Кактаким образом, вы явно должны квалифицировать вложенный класс, используя базовый класс.

Это поведение было преднамеренно сделано более строгим в Kotlin, чтобы избежать некоторой путаницы в Java, связанной с доступом к статическим членам / классам через производные типы.Вы также видите, что многие IDE предупреждают вас в Java, когда вы используете имя производного класса для ссылки на статические символы в базовом классе.

Что касается терминологии, у Kotlin есть четкое определение внутренних классов (а именно аннотированные ключевым словом inner).Не все вложенные классы являются внутренними классами.См. Также здесь .

Связанный:

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