如何在Kotlin中重写HashMaps入口集方法?
我想将本文中的java类转换为kotlin如何在Kotlin中重写HashMaps入口集方法?,kotlin,Kotlin,我想将本文中的java类转换为kotlin public class ProxyRetrofitQueryMap extends HashMap<String, Object> { public ProxyRetrofitQueryMap(Map<String, Object> m) { super(m); } @Override public Set<Entry<String, Object>> entrySet() { Set
public class ProxyRetrofitQueryMap extends HashMap<String, Object> {
public ProxyRetrofitQueryMap(Map<String, Object> m) {
super(m);
}
@Override
public Set<Entry<String, Object>> entrySet() {
Set<Entry<String, Object>> newSet = new HashSet<>();
return newSet;
}
}
转换没有帮助,它会导致平台声明冲突。我想手动创建从HashMap扩展的Kotlin类,但该类没有entrySet函数。怎么办?当使用kotlin.collections.HashMap或java.util.HashMap时,可以通过其属性访问entrySet函数,您可以这样覆盖它们:
class ProxyRetrofitQueryMap : HashMap<String, Any>() {
override val entries: MutableSet<MutableMap.MutableEntry<String, Any>>
get() {
val newSet = HashSet<MutableMap.MutableEntry<String, Any>>()
return newSet
}
}
通过在代码中使用该属性,然后在IDE中导航到其声明,可以确认该属性映射到原始函数。不幸的是,文档似乎没有明确说明这种行为,或者至少我找不到它。当使用kotlin.collections.HashMap或java.util.HashMap时,entrySet函数可以通过它们的属性访问,您可以这样覆盖它们:
class ProxyRetrofitQueryMap : HashMap<String, Any>() {
override val entries: MutableSet<MutableMap.MutableEntry<String, Any>>
get() {
val newSet = HashSet<MutableMap.MutableEntry<String, Any>>()
return newSet
}
}
通过在代码中使用该属性,然后在IDE中导航到其声明,可以确认该属性映射到原始函数。不幸的是,文档似乎没有明确说明这种行为,或者至少我找不到它。以下是完整的解决方案,转换为Kotlin:
class ProxyRetrofitQueryMap(m: MutableMap<String, Any>) : HashMap<String, Any>(m) {
override val entries: MutableSet<MutableMap.MutableEntry<String, Any>>
get() {
val originSet: Set<Map.Entry<String?, Any?>> = super.entries
val newSet: MutableSet<MutableMap.MutableEntry<String, Any>> = HashSet()
for ((key, entryValue) in originSet) {
val entryKey = key ?: throw IllegalArgumentException("Query map contained null key.")
// Skip null values
requireNotNull(entryValue) { "Query map contained null value for key '$entryKey'." }
if (entryValue is List<*>) {
for (arrayValue in entryValue) {
if (arrayValue != null) { // Skip null values
val newEntry: MutableMap.MutableEntry<String, Any> =
SimpleEntry(entryKey, arrayValue)
newSet.add(newEntry)
}
}
} else {
val newEntry: MutableMap.MutableEntry<String, Any> = SimpleEntry(entryKey, entryValue)
newSet.add(newEntry)
}
}
return newSet
}
}
以下是转换为Kotlin的完整解决方案:
class ProxyRetrofitQueryMap(m: MutableMap<String, Any>) : HashMap<String, Any>(m) {
override val entries: MutableSet<MutableMap.MutableEntry<String, Any>>
get() {
val originSet: Set<Map.Entry<String?, Any?>> = super.entries
val newSet: MutableSet<MutableMap.MutableEntry<String, Any>> = HashSet()
for ((key, entryValue) in originSet) {
val entryKey = key ?: throw IllegalArgumentException("Query map contained null key.")
// Skip null values
requireNotNull(entryValue) { "Query map contained null value for key '$entryKey'." }
if (entryValue is List<*>) {
for (arrayValue in entryValue) {
if (arrayValue != null) { // Skip null values
val newEntry: MutableMap.MutableEntry<String, Any> =
SimpleEntry(entryKey, arrayValue)
newSet.add(newEntry)
}
}
} else {
val newEntry: MutableMap.MutableEntry<String, Any> = SimpleEntry(entryKey, entryValue)
newSet.add(newEntry)
}
}
return newSet
}
}
哇,这真的应该被记录。哇,这真的应该被记录。