首页 > 解决方案 > 从 kotlin 调用的第三方 java 库中的重载解析歧义

问题描述

我在 Kotlin 中编写了一个小程序,它使用库https://github.com/KaptainWutax/SeedUtils,特别是 Dimension 枚举https://github.com/KaptainWutax/SeedUtils/blob/master/src/main/java/kaptainwutax/种子工具/mc/Dimension.java

当我打电话给 egDimension.OVERWORLD.name时,我得到了Overload resolution ambiguity。我知道问题出在哪里,问题是enum Dimensionname字段,而枚举类本身有name字段https://kotlinlang.org/docs/reference/enum-classes.html

问题是,我能做些什么。我目前的方法是分叉这个库和我使用并依赖它的所有其他 4 个库,name在那个枚举中重命名为其他东西,但我讨厌不得不分叉 5 个 repos 来重命名单个字段。

有没有其他方法可以解决这个问题?我可以以某种方式指定应该使用哪个名称吗?有没有办法通过告诉JVM该做什么来以某种方式消除这种歧义?

还是没有什么可做的,命名枚举字段name是使其无法被 Kotlin 使用的有效方法?

标签: javakotlinenums

解决方案


一种解决方法是在 Java 中编写一个辅助方法,它是明确的:

public class DimensionHelper {
    public static String getName(Dimension dimension) {
        return dimension.name;
    }
}

然后在 Kotlin 中,您可以DimensionHelper.getName()在想要访问 a 的名称时调用Dimension。然后,您可以在 Kotlin 中添加扩展方法:

fun Dimension.getName() = DimensionHelper.getName(this);

...这将允许您只使用Dimension.OVERWORLD.getName().

这远非理想,但确实避免了分叉。

(当然,我完全不知道有一种特定于 Kotlin 的方式来执行此操作。)


推荐阅读