gpt4 book ai didi

kotlin - 不可为空的可变映射

转载 作者:行者123 更新时间:2023-12-02 12:39:54 33 4
gpt4 key购买 nike

  • java :1.8.0_102
  • Kotlin :1.0.4

  • 我正在尝试创建一个 map ,您可以在其中执行类似 map["key"] += 5 的操作类似于javascript。

    Kotlin 已有 withDefault这解决了其中的一部分,但 map 的 get 函数仍然返回一个可为空的值,所以我继续在 withDefault 的启发下实现我自己的实现。
    interface NonNullableMutableMap<K,V> : MutableMap<K,V> {
    override fun put(key: K, value: V): V
    override fun get(key: K): V
    }

    fun <K,V> MutableMap<K,V>.withoutNullValues(default: () -> V): NonNullableMutableMap<K, V> {
    return NonNullableMapWrapper(this, default)
    }

    class NonNullableMapWrapper<K,V>(val map: MutableMap<K,V>, val default: () -> V) : NonNullableMutableMap<K,V> {
    override fun put(key: K, value: V): V = map.put(key, value) ?: default()

    override fun get(key: K): V {
    val value = map.getOrPut(key, default)
    return value
    }
    override val size: Int get() = map.size

    override fun containsKey(key: K): Boolean = map.containsKey(key)

    override fun containsValue(value: V): Boolean = map.containsValue(value)

    override fun isEmpty(): Boolean = map.isEmpty()

    override val entries: MutableSet<MutableMap.MutableEntry<K, V>> get() = map.entries
    override val keys: MutableSet<K> get() = map.keys
    override val values: MutableCollection<V> get() = map.values

    override fun clear() {
    map.clear()
    }

    override fun putAll(from: Map<out K, V>) {
    map.putAll(from)
    }

    override fun remove(key: K): V {
    return map.remove(key) ?: default()
    }
    }

    我创建了以下单元测试来测试它
    class NonNullableMapTest {

    @Test
    fun notNullableTest() {
    val map = HashMap<String, Long>().withoutNullValues { 0 }
    map["first"] += 10L
    map["second"] -= 10L
    assertThat(map["first"]).isEqualTo(10L)
    assertThat(map["second"]).isEqualTo(-10L)
    assertThat(map["third"]).isEqualTo(0L)
    }
    }

    但是当我运行测试时出现以下错误:
    tried to access method kotlin.collections.MapsKt__MapsJVMKt.set(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)V from class foo.bar.NonNullableMapTest
    java.lang.IllegalAccessError: tried to access method kotlin.collections.MapsKt__MapsJVMKt.set(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)V from class foo.bar.NonNullableMapTest

    知道如何解决这个问题吗?

    最佳答案

    这对我来说似乎是一个错误。我建议在 Kotlin (KT) | YouTrack 报告它.

    一种解决方法是明确定义 set在您的 NonNullableMutableMap界面。例如。:

    interface NonNullableMutableMap<K, V> : MutableMap<K, V> {
    override fun put(key: K, value: V): V
    override fun get(key: K): V
    operator fun set(key: K, value: V) {
    put(key, value)
    }
    }

    关于kotlin - 不可为空的可变映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40006315/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com