java - 从 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 Dimension
有name
字段,而枚举类本身有name
字段https://kotlinlang.org/docs/reference/enum-classes.html
问题是,我能做些什么。我目前的方法是分叉这个库和我使用并依赖它的所有其他 4 个库,name
在那个枚举中重命名为其他东西,但我讨厌不得不分叉 5 个 repos 来重命名单个字段。
有没有其他方法可以解决这个问题?我可以以某种方式指定应该使用哪个名称吗?有没有办法通过告诉JVM该做什么来以某种方式消除这种歧义?
还是没有什么可做的,命名枚举字段name
是使其无法被 Kotlin 使用的有效方法?
解决方案
一种解决方法是在 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 的方式来执行此操作。)
推荐阅读
- javascript - req.files 在ajax调用后给出NULL,文件名不正确
- node.js - 无法使用 Node / Express 在 POST 请求中发送正确的响应
- python - Paraview - 使用 python 脚本以 x3d 格式导出数据
- c++ - 如何在 C/C++ 中计算 n=100 的加泰罗尼亚数字?
- selenium - 尝试单击 Kendo UI 控件时未找到元素错误
- python-3.x - 如何在 python 模板中将 $ 作为字符串而不是变量?
- php - 从 json 设置选择选项
- regex - 是否有一个正则表达式可以将前 4 个字符添加到字符串的末尾,将后 4 个字符添加到字符串的开头?
- scala - 如何注入随机数。加特林的用户?
- android - 将提交按钮添加到 SearchView