当前位置: 首页 > 面试题库 >

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

艾浩穰
2023-03-14
问题内容

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

有没有一种方法可以通过派生类访问字段?

// html" target="_blank">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

因此,您必须显式地使用基类对嵌套类进行限定。

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

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



 类似资料:
  • 问题内容: 基本上我需要做的是 我尝试做明显的 但这最终会引发异常 即使在互操作文档中为访问静态字段指定的表示法也会产生相同的异常 问题答案: 您可以使用$访问内部类 请注意,如果要导入,也应该导入。

  • 静态内部类是指使用 static 修饰的内部类。示例代码如下: 上述示例中的 Inner 类就是静态内部类。静态内部类有如下特点。 1) 在创建静态内部类的实例时,不需要创建外部类的实例。 2) 静态内部类中可以定义静态成员和实例成员。外部类以外的其他类需要通过完整的类名访问静态内部类中的静态成员,如果要访问静态内部类中的实例成员,则需要通过静态内部类的实例。 3) 静态内部类可以直接访问外部类的

  • 几天前我为STS安装了Sonarint,我想问一个关于Java:S3252规则的问题(“静态”基类成员不应通过派生类型访问)。 在我的代码中,出于某种原因(我不是该公司的架构师),许多程序都使用了包含i18n密钥的接口。其中一个接口被称为,并扩展了。当我需要来自的密钥时,如果类涉及“Regie”,例如,而不是。在这种情况下,不遵守S3252规则。 在我看来,使用(孩子)有助于防止开发人员在某一天,

  • 问题内容: 静态和非静态嵌套类有什么区别? 问题答案: 根据定义,内部类不能是静态的,因此我将重述您的问题为“静态和非静态嵌套类之间有什么区别?” 非静态嵌套类具有对其嵌套的类的成员的完全访问权。静态嵌套类没有对嵌套实例的引用,因此静态嵌套类无法调用非静态方法或访问嵌套该类的实例的非静态字段。

  • 问题内容: 在ES6中,给出以下示例: 如何访问Color.mainDark(静态字段)? 问题答案: 您可以按期望的方式访问它,但是,如果我记得使用Babel并立即导出类时存在一些问题,因此 如果 遇到问题,请在定义类后导出: 您可以在玛丽安(Marian)对类似问题的回答中了解有关巴别塔(Babel)问题的更多信息,该问题据说已在巴别塔(Babel)6.2.1中修复。

  • 我正在装一个应用程序,它工作得很好。但当我使用 在OuterClass中,并通过