我用 Kotlin 编写了一个小程序,它使用库 https://github.com/KaptainWutax/SeedUtils ,特别是 Dimension 枚举 https://github.com/KaptainWutax/SeedUtils/blob/master/src/main/java/kaptainwutax/seedutils/mc/Dimension.java
当我打电话时,例如Dimension.OVERWORLD.name
,我得到重载解析歧义
。
我知道问题是什么,问题是 enum Dimension
有 name
字段,而枚举类本身有 name
字段 https://kotlinlang.org/docs/reference/enum-classes.html
问题是,我能做些什么呢?我当前的方法是 fork 这个库和我使用并依赖它的所有其他 4 个库,将该枚举中的 name
重命名为其他内容,但我讨厌必须 fork 5 个存储库来重命名单个字段。
还有其他方法可以解决这个问题吗?我可以以某种方式指定应该使用哪个名称吗?有没有办法通过告诉 JVM 做什么来消除这种歧义?
或者是否没有什么可做的,并且命名枚举字段 name
是使其无法被 Kotlin 使用的有效方法?
最佳答案
一种解决方法是用 Java 编写一个辅助方法,它是明确的:
public class DimensionHelper {
public static String getName(Dimension dimension) {
return dimension.name;
}
}
然后,在 Kotlin 中,只要您想要访问 Dimension
的名称,您就可以调用 DimensionHelper.getName()
。然后您可以在 Kotlin 中添加扩展方法:
fun Dimension.getName() = DimensionHelper.getName(this);
...这将允许您仅使用Dimension.OVERWORLD.getName()
。
这远非理想,但它确实避免了 fork 。
(当然,完全有可能存在一种我不知道的 Kotlin 特定方法。)
关于java - 从 kotlin 调用的第三方 java 库中的重载解决歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63736339/