Kotlin 子类中未识别子类型

Kotlin 子类中未识别子类型,kotlin,generics,Kotlin,Generics,我有以下代码设置 abstract class GenericQuestionEditor() { protected abstract var data: GenericQuestionData } 但是,当我创建EditorSimple()时,当我试图将数据设置为DataSimple()时,它会抛出一个错误,为什么 class EditorSimple(): GenericQuestionEditor() { override var data = DataSimple()

我有以下代码设置

abstract class GenericQuestionEditor() {
    protected abstract var data: GenericQuestionData
}
但是,当我创建
EditorSimple()
时,当我试图将
数据设置为
DataSimple()
时,它会抛出一个错误,为什么

class EditorSimple(): GenericQuestionEditor() {
    override var data = DataSimple()
}
我的
GenericQeustionData
DataSimple()
是这样设置的

abstract class GenericQuestionData {}
如果我在
GenericQuestionEditor()中创建此函数,它不会抱怨

为什么我在
EditorSimple()
中的
数据上出现错误?它应该将它识别为一个子类型,并且我认为它应该被允许


我觉得答案可以在中找到,但我不确定在这种情况下如何配置它,因为它们不是传递的值或集合的一部分。

您需要明确指定类型:

class EditorSimple(): GenericQuestionEditor() {
    override var data: GenericQuestionData = DataSimple()
}
如果没有类型注释,
数据
的类型将被推断为
DataSimple
,这与其超类“
数据
的类型不匹配。即使类型是相关的,也不能用子类型重写可写属性。想象一下,如果我这样做了:

class SomeOtherData: GenericQuestionData()

val editor: GenericQuestionEditor = EditorSimple()
editor.data = SomeOtherData() // data is of type GenericQuestionData, so I should be able to do this

但是,
editor
实际上有一个
EditorSimple
,它只能在
数据中存储
DataSimple
对象

您需要明确指定类型:

class EditorSimple(): GenericQuestionEditor() {
    override var data: GenericQuestionData = DataSimple()
}
如果没有类型注释,
数据
的类型将被推断为
DataSimple
,这与其超类“
数据
的类型不匹配。即使类型是相关的,也不能用子类型重写可写属性。想象一下,如果我这样做了:

class SomeOtherData: GenericQuestionData()

val editor: GenericQuestionEditor = EditorSimple()
editor.data = SomeOtherData() // data is of type GenericQuestionData, so I should be able to do this

但是,
editor
实际上有一个
EditorSimple
,它只能在
数据中存储
DataSimple
对象

@Tenfour04 True,我应该说得更具体些。但是你失去了
DataSimple()
的方法/属性,必须在任何时候使用它们。“我可以记住演员阵容,但这似乎不太理想。@格伦德,我已经解释了为什么你不能这样覆盖。”。你不相信这个解释吗?除非将其设置为
val
,否则无法执行此操作。如果确实需要
DataSimple
,则可以将该类型设置为类型参数:
class GenericQuestionEditor(){protected AbstractVar data:D}
class Editor Simple:GenericQuestionEditor(){…}
@Tenfour04 True,我应该说得更具体一些。但是,如果你失去了
DataSimple()
的方法/属性,就必须在任何时候使用它们。“我可以记住演员阵容,但这似乎不太理想。@格伦德,我已经解释了为什么你不能这样覆盖。”。你不相信这个解释吗?除非将其设置为
val
,否则无法执行此操作。如果确实需要
DataSimple
,则可以将该类型设置为类型参数:
class GenericQuestionEditor(){protected AbstractVar data:D}
class Editor Simple:GenericQuestionEditor(){…}