Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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类层次结构和(co)方差_Kotlin_Generics_Covariance - Fatal编程技术网

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