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

7

我有一些在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
哦,这在Java中可以工作,但这对你没有帮助。 :-) - T.J. Crowder
2
只是出于好奇,你为什么要这样做?我没有看到任何实际应用场景适合这么做。 - Lino
我的数据库架构存储在以Schema_V1到Schema_V42命名的类中,这些类具有静态成员,用于存储有关表/列的信息。此外,还有一个派生的Schema_Latest类,它扩展了最新的架构。这个Schema_Latest基本上只是最新架构的类型别名,它是除了执行数据库模式升级的代码之外的任何地方都使用的架构。我正在尝试在Kotlin代码中的查询中引用Schema_Latest.MyTable.SomeColumn。 - keccs
1个回答

4
在 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 中因通过派生类型访问静态成员/类而引起的一些混淆。你还会看到,在 Java 中,当你使用派生类名来引用基类中的静态符号时,很多 IDE 都会警告你。
关于术语,Kotlin 对“内部类”有一个清晰的定义(即那些带有 "inner" 关键字注释的类)。并非所有嵌套类都是内部类。请参见此处
相关内容:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接