通过派生类访问用Java定义的静态内部类

时间:2019-04-30 08:59:48

标签: java kotlin interop

我有一些用Java定义的类,类似于下面的代码。 我正在尝试通过派生的Java类访问SomeValue,这在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 个答案:

答案 0 :(得分:1)

在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关键字的内部类)有清晰的定义。并非所有嵌套类都是内部类。另请参见here

相关: