为什么我不能在Kotlin中访问超类的枚举?

时间:2017-08-25 11:07:49

标签: java android enums kotlin subclass

我正在将Java Android项目转换为Kotlin。

我正在使用API.AI's client,它有两个AIConfiguration类:

超类

package ai.api;
public class AIConfiguration implements Cloneable {
     public static enum SupportedLanguages {
         English("en"),
         //...
     }
         //...
}

子类

package ai.api.android;
public class AIConfiguration extends ai.api.AIConfiguration {
    public enum RecognitionEngine {
    //...
}

在我的Java代码中,我正在创建子类的实例,如api指南中所建议的那样:

final AIConfiguration config = new AIConfiguration("TOKEN",
        AIConfiguration.SupportedLanguages.English,
        AIConfiguration.RecognitionEngine.System);

转换为Kotlin后,它看起来像这样:

val config = AIConfiguration("TOKEN",
        AIConfiguration.SupportedLanguages.English,
        AIConfiguration.RecognitionEngine.System)

...导致 Unresolved reference: SupportedLanguages

  • 我可以更新对成功编译的ai.api.AIConfiguration.SupportedLanguages.English的引用。
  • 我可以使用import ai.api.AIConfiguration as SuperAIConfiguration导入超类并使用SuperAIConfiguration.SupportedLanguages,但我宁愿直接在子类上引用枚举。

我不明白:为什么这个引用在Java中有效但在Kotlin中没有?

1 个答案:

答案 0 :(得分:1)

Kotlin中的可见性规则与Java中的可见性规则不同。 Kotlin类不会“继承”超类的静态嵌套类,因为当伴随对象起作用时,规则变得太复杂了。我们试图使规则尽可能简单,并且通过超类型名称访问嵌套类通常没有问题,但是在您的情况下,子类和超类的简称冲突。这不是典型的情况,因此您可以选择在问题中列出的选项:完全限定的名称或在导入时重命名。