Kotlin类层次结构和(co)方差
在我的设置中,我试图拥有一个从Kotlin类层次结构和(co)方差,kotlin,generics,covariance,Kotlin,Generics,Covariance,在我的设置中,我试图拥有一个从Map继承的接口Table(因为它主要用作映射的包装器)。两个类继承自表——本地和全局。全局的将有一个可变映射,而本地的将有一个只包含本地条目的映射 //条目 密封类条目{ 类EntryLocal:条目 类EntryGlobal:Entry } 接口表:映射{ fun getRecursive(键:字符串):条目? } 类GlobalTable(val-map:MutableMap):表,按映射映射{ override fun getRecursive(键:字符串)
Map
继承的接口Table
(因为它主要用作映射的包装器)。两个类继承自表
——本地和全局。全局的将有一个可变映射,而本地的将有一个只包含本地条目的映射
//条目
密封类条目{
类EntryLocal:条目
类EntryGlobal:Entry
}
接口表:映射{
fun getRecursive(键:字符串):条目?
}
类GlobalTable(val-map:MutableMap):表,按映射映射{
override fun getRecursive(键:字符串)=此[键]
...
}
类LocalTable(
private val parent:表,
val地图:地图
):表,映射{//给出错误
重写getRecursive(键:字符串):条目?=map[key]?:parent.getRecursive(键)
}
我得到以下错误:
Type parameter V of 'Map' has inconsistent values: Entry, EntryVar
为什么呢?
Map
不是从Map
继承吗?你说得对Map
的值类型是协变的,因此Map
是Map
然而,这不是你的问题。问题是LocalTable
继承了Map
(直接)和Map
(通过Table
)这两种方法,因此不清楚LocalTable
中的值类型应该是什么
换句话说,LocalTable.get的返回类型是什么?它是入口
还是入口本地
简而言之,问题在于:
interface M<T> {}
interface A : M<String> {}
interface B : M<Object> {}
class C : A, B {}
接口M{}
接口A:M{}
接口B:M{}
C类:A,B{}
您将得到相同的错误,即M
的参数T
的值不一致。即使String
是对象
,Kotlin也不会假定基类M
的类型参数t
因此应该是String
(或对象
)。谢谢!我希望这是支持的-我不明白为什么它会给编译器带来麻烦。另外,上面的代码是否编译?我认为Kotlin不支持类的多重继承(它可以与接口一起工作),它还说“在超类型列表中只能出现一个类”,除了您得到的错误之外。但是你是对的,有了接口,示例会更清晰!您可以通过将表的键类型设置为T
,其中T:Entry
,来实现这一点,但您将无法将LocalTable的父项设置为LocalTable以外的任何内容,因为否则parent.getRecursive(Key)
不会返回EntryLocal。这很好-LocalTable::getRecursive
无论如何都会返回一个条目(因为它取决于家长,家长可能是一个GlobalTable