java - 从 kotlin 调用的第三方 java 库中的重载解决歧义

标签 java kotlin enums

我用 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 Dimensionname 字段,而枚举类本身有 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/

相关文章:

c# - 在 C# 中扩展枚举

java - 如果是 Java 中的数组列表。列表的最大容量是多少

java - 在 Java 中的 cookie 中存储多个值

Java 8 类来表示时间间隔

java - 你如何让 Mockito 与 Kotlin 不可为空的类型配合得很好?

.net - Enum.GetName 与 Enum.ToString

java - 通话录音失败,出现 java.lang.IllegalStateException

kotlin - 如果其中一个为空,则发布者串联

spring - 来自 YAML 的 Kotlin 中的 @Value 和列表

enums - JSON 模式枚举可以不区分大小写吗?