Luk*_*dič 3 generics covariance kotlin
在我的设置中,我试图有一个Table
继承自的接口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)
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Type parameter V of 'Map' has inconsistent values: Entry, EntryVar
Run Code Online (Sandbox Code Playgroud)
这是为什么?不是Map<String, EntryLocal>
继承自Map<String, Entry>
?
你是对的,值类型Map
是协变的,所以 aMap<String, EntryLocal>
是 a Map<String, Entry>
。
然而,这不是你的问题。问题是,LocalTable
从两个继承Map<String, EntryLocal>
(直接)和Map<String, Entry>
(通过Table
),因此目前还不清楚值类型应该是什么LocalTable
。
换句话说, 的返回类型是LocalTable.get
什么?是Entry
还是EntryLocal
?
简而言之,问题如下:
interface M<T> {}
interface A : M<String> {}
interface B : M<Object> {}
class C : A, B {}
Run Code Online (Sandbox Code Playgroud)
你会得到同样的错误,说参数T
的M
值不一致。即使String
是Object
,Kotlin 也不会假设T
基类的类型参数M
因此应该是String
(或Object
)。
归档时间: |
|
查看次数: |
60 次 |
最近记录: |