通过派生 class 访问在 Java 中定义的静态内部 class

Accessing static inner class defined in Java, through derived class

我在 java 中定义了一些 classes,类似于下面的代码。 我正在尝试通过派生的 java class 访问 SomeValue,这在 java 中是允许的,但在 kotlin 中是不允许的。

有没有办法通过派生的class访问该字段?

// 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

在 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

因此,您必须明确地使用基数 class 限定嵌套 class。

此行为在 Kotlin 中有意变得更加严格,以避免 Java 中与通过派生类型访问静态 members/classes 相关的一些混淆。您还会看到,当您使用派生的 class 名称来引用基 class.

中的静态符号时,许多 IDE 会在 Java 中警告您

关于术语,Kotlin有明确的定义inner classes(即用inner关键字注解的)。并非所有嵌套 classes 都是内部 classes。另见 here.

相关: