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

问题描述 投票:5回答:1

我在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

java kotlin interop
1个回答
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

有关:

© www.soinside.com 2019 - 2024. All rights reserved.