gpt4 book ai didi

Kotlin 类层次结构和(协)方差

转载 作者:行者123 更新时间:2023-12-04 02:27:12 29 4
gpt4 key购买 nike

在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。

// entries
sealed class Entry {
class EntryLocal : Entry
class EntryGlobal : Entry
}

interface Table : Map<String, Entry> {
fun getRecursive(key: String): Entry?
}

class GlobalTable(val map:MutableMap<String, Entry>) : Table, Map<String, Entry> by map {
override fun getRecursive(key: String) = this[key]

...
}

class LocalTable(
private val parent: Table,
val map: Map<String, EntryLocal>
) : Table, Map<String, EntryLocal> { // gives error
override fun getRecursive(key: String): Entry? = map[key] ?: parent.getRecursive(key)

}
我收到以下错误:
Type parameter V of 'Map' has inconsistent values: Entry, EntryVar
这是为什么?没有 Map<String, EntryLocal>继承自 Map<String, Entry> ?

最佳答案

您是对的 Map 的值类型是协变的,所以是 Map<String, EntryLocal>Map<String, Entry> .
然而,这不是你的问题。问题是LocalTable继承自 Map<String, EntryLocal> (直接)和 Map<String, Entry> (通过 Table )所以不清楚 LocalTable 中的值类型应该是什么.
换句话说,LocalTable.get 的返回类型是什么? ?是吗EntryEntryLocal ?
简而言之,问题如下:

interface M<T> {}
interface A : M<String> {}
interface B : M<Object> {}
class C : A, B {}
你会得到同样的错误,说参数 TM具有不一致的值。即使 StringObject ,Kotlin 不会假定类型参数 T基类 M因此应该是 String (或 Object)。

关于Kotlin 类层次结构和(协)方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66715676/

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