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