在Kotlin中使用Java枚举时的重载解析歧义

在Kotlin中使用Java枚举时的重载解析歧义,kotlin,Kotlin,我在Kotlin代码中使用java enum io.confluent.kafka.schemaregistry.avro.AvroCompatibilityLevel public enum AvroCompatibilityLevel { NONE("NONE", AvroCompatibilityChecker.NO_OP_CHECKER), // ... public final String name; public final AvroCompatibili

我在Kotlin代码中使用java enum io.confluent.kafka.schemaregistry.avro.AvroCompatibilityLevel

public enum AvroCompatibilityLevel {
   NONE("NONE", AvroCompatibilityChecker.NO_OP_CHECKER),
   // ...

   public final String name;
   public final AvroCompatibilityChecker compatibilityChecker;

   // ...
在科特林,我想利用

AvroCompatibilityLevel.NONE.name

但这导致了一场灾难

Overload resolution ambiguity. All these functions match:

public final val name: String? // coming from the field name

public final val name: String // coming from enum

有人能指出如何克服这个问题吗?

您可以编写一个扩展属性来提取成员字段“name”的值,如下所示:

import kotlin.reflect.full.memberProperties

private val innerNameCache = mutableMapOf<AvroCompatibilityLevel, String>()
val AvroCompatibilityLevel.innerName: String
    get() = innerNameCache.getOrPut(this) {
        AvroCompatibilityLevel::class.memberProperties.filter { it.name == "name" }[0].get(this) as String
    }

fun main() {
    println(AvroCompatibilityLevel.NONE.innerName)
}
导入kotlin.reflect.full.memberProperties
私有val innerNameCache=mutableMapOf()
val AvroCompatibilityLevel.innerName:字符串
get()=innerNameCache.getOrPut(此){
AvroCompatibilityLevel::class.memberProperties.filter{it.name==“name”}[0]。将(此)作为字符串获取
}
主要内容(){
println(AvroCompatibilityLevel.NONE.innerName)
}

如果您有权访问原始Java代码,则应将
名称
重命名为其他名称或创建访问器(例如
getName()
)。如果您不能修改原始的Java代码,那么我想除了编写Java包装器之外,您没有什么可以做的了。我没有访问代码的权限,但是我想需要另一种方法来克服这个问题,然后复制类作为解决此特定情况的方法,您可以调用
toString()
AvroCompatibilityLevel
实例上,而不是使用
名称
。根据研究结果,它将给出相同的结果。