Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.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中重写HashMaps入口集方法?_Kotlin - Fatal编程技术网

如何在Kotlin中重写HashMaps入口集方法?

如何在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

我想将本文中的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<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
        }
}


哇,这真的应该被记录。哇,这真的应该被记录。