本文介绍了通过派生类访问用Java定义的静态内部类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些用Java定义的类,类似于下面的代码.我正在尝试通过派生的Java类访问SomeValue,这在Java中是允许的,但在Kotlin中是不允许的.

I've got some classes defined in java, similar to the code below.I'm trying to access SomeValue through a derived java class, which is allowed in java, but not in kotlin.

是否可以通过派生类访问字段?

Is there a way to access the field through the derived 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中,嵌套类型和伴随对象不会自动继承.

In Kotlin, nested types and companion objects are not automatically inherited.

此行为不是Java特有的,您可以单独在Kotlin中重现相同的行为:

This behavior is not specific to Java, you can reproduce the same behavior in Kotlin alone:

open class Base {
    class Nested
}

class Derived : Base()

val base = Base.Nested::class        // OK
val derived = Derived.Nested::class  // Error: 'Nested' unresolved

因此,您必须明确地使用基类对嵌套类进行限定.

As such, you explicitly have to qualify the nested class using the base class.

在Kotlin中,故意将此行为更严格,以避免Java中与通过派生类型访问静态成员/类有关的某些混乱.您还可以看到,当使用派生的类名来引用基类中的静态符号时,很多IDE都会用Java警告您.

This behavior was deliberately made more strict in Kotlin, to avoid some of the confusion in Java related to accessing static members/classes via derived types. You also see that a lot of IDEs warn you in Java when you use a derived class name to refer to static symbols in the base class.

关于术语,Kotlin对内部类(即用inner关键字注释的类)有清晰的定义.并非所有嵌套类都是内部类.另请参见此处.

Regarding terminology, Kotlin has a clear definition of inner classes (namely those annotated with the inner keyword). Not all nested classes are inner classes. See also here.

相关:

  • Kotlin - accessing companion object members in derived types
  • Kotlin: How can I create a "static" inheritable function?

这篇关于通过派生类访问用Java定义的静态内部类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-22 14:32