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(){…}
。