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

通过派生类访问Java中定义的静态内部类,java,kotlin,interop,Java,Kotlin,Interop,我已经用java定义了一些类,类似于下面的代码。 我试图通过一个派生的java类访问SomeValue,这在java中是允许的,但在kotlin中是不允许的 是否有通过派生类访问字段的方法 // java file // ------------------------------------------------- class MyBaseClass { public static final class MyInnerClass { public stat

我已经用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


在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对内部类(即用
internal
关键字注释的类)有明确的定义。并非所有嵌套类都是内部类。另见

相关的:


嗯。在Java中工作,但这对您没有帮助。:-)只是出于好奇,你为什么要这么做?我看不到任何实际的用例适合这样做。我的数据库模式存储在名为Schema_V1到Schema_V42的类中,静态成员存储有关表/列的信息。还有一个派生的Schema_Latest类,它扩展了最新的Schema。这个Schema_Latest基本上只是最新模式的一个类型别名,除了在进行数据库模式升级的代码中之外,它在任何地方都使用。我试图在kotlin代码中引用查询中的Schema_Latest.MyTable.SomeColumn。