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