为什么我不能在 Kotlin 中访问超类的枚举?
Why can't I access a superclass' enum in Kotlin?
我正在将一个 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 classes 不会 "inherit" 静态嵌套 classes 来自超类型,因为当伴生对象发挥作用时规则变得太复杂了。我们正在努力使规则尽可能简单,通常通过超类型名称访问嵌套 class 没有问题,但在您的情况下是 subclass 和 super[=14 的短名称=] 冲突。这不是典型的,因此您有问题中列出的选项:完全限定名称或导入时重命名。
我正在将一个 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 classes 不会 "inherit" 静态嵌套 classes 来自超类型,因为当伴生对象发挥作用时规则变得太复杂了。我们正在努力使规则尽可能简单,通常通过超类型名称访问嵌套 class 没有问题,但在您的情况下是 subclass 和 super[=14 的短名称=] 冲突。这不是典型的,因此您有问题中列出的选项:完全限定名称或导入时重命名。