Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从kotlin调用的第三方java库中的重载解析歧义_Java_Kotlin_Enums - Fatal编程技术网

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

从kotlin调用的第三方java库中的重载解析歧义,java,kotlin,enums,Java,Kotlin,Enums,我用Kotlin编写了一个小程序,它使用库,特别是维度枚举 当我调用例如Dimension.OVERWORLD.name时,会得到重载解析歧义。 我知道问题是什么,问题是enum维度有name字段,而enum类本身有name字段 问题是,我能做些什么呢。我目前的方法是分叉这个库和我使用并依赖它的所有其他4个库,将枚举中的名称重命名为其他名称,但我讨厌分叉5个repo来重命名单个字段 还有别的办法吗?我可以指定应该使用哪个名称吗?有没有办法通过告诉JVM怎么做来消除这种模糊性 还是说什么都不做,命

我用Kotlin编写了一个小程序,它使用库,特别是维度枚举

当我调用例如Dimension.OVERWORLD.name时,会得到重载解析歧义。 我知道问题是什么,问题是enum维度有name字段,而enum类本身有name字段

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

还有别的办法吗?我可以指定应该使用哪个名称吗?有没有办法通过告诉JVM怎么做来消除这种模糊性


还是说什么都不做,命名枚举字段名是Kotlin使其不可用的有效方法?

一个解决方法是用Java编写一个助手方法,它是明确的:

公共类帮助器{ 公共静态字符串getNameDimension维度{ 返回dimension.name; } } 然后,在Kotlin中,您可以随时调用DimensionHelper.getName来访问维度的名称。然后可以在Kotlin中添加扩展方法:

fun Dimension.getName=DimensionHelper.getNamethis; 。。。这将允许您只使用Dimension.OVERWORLD.getName

这远非理想,但它确实避免了叉子


当然,我完全可能不知道有一种Kotlin特有的方法可以做到这一点。

除了提供的解决方法之外,可能还有其他一些方法。我能想到的一个方法是简单地使用普通的旧java反射api和kotlin扩展方法:

private val nameField=Dimension::class.java.getDeclaredFieldname fun Dimension.getName=nameField.getthis作为字符串 您可以这样称呼它:

val name=Dimension.OVERWORLD.getName 遗憾的是,这不适用于kotlin反射,因为这样我们会遇到相同的错误:

维度::名称//重载解析歧义 这种使用反射的方法也可以改进,只需查找一次名称。为此,请创建一个包含贴图的小辅助对象:

私有对象名称持有者{ val dimensionToName=EnumMapDimension::class.java 初始化{ val nameField=Dimension::class.java.getDeclaredFieldname 用于dimension.values中的维度{ dimensionToName[dimension]=nameField.getdimension作为字符串 } } } 然后将扩展方法更改为:

fun Dimension.getName=NameHolder.dimensionToName[此]!!
还可以通过在kotlin中添加扩展方法来优化:fun Dimension.getName=DimensionHelper.getNamethis;它允许您调用Dimension.OVERWORLD。getName@Lino:听起来是个好主意-介意我把它加到答案中吗?谢谢!我不知道我能在kotlin中如此轻松地获得java反射。我不能接受两个答案。@MatějRačinský不客气。在kotlin类上使用java反射或在java类上使用kotlin反射时,您只需小心。由于kotlin编译成java的性质不同,类定义可能不同。@MatějRačinskýFYI,建议在一段时间内(例如24小时)不要接受任何答案,以便给不同时区的人一个机会。不过,我并不是说这些答案我会做得更好!哦,好吧,我不知道。下次我会记住的。