glend
glend

Reputation: 1622

Subtypes not being recognized in Subclasses

I have the following code setup;

abstract class GenericQuestionEditor() {
    protected abstract var data: GenericQuestionData
}

but then when I create EditorSimple() it throws an error when I try to set data to DataSimple(), why?

class EditorSimple(): GenericQuestionEditor() {
    override var data = DataSimple()
}

my GenericQeustionData and DataSimple() are setup like this;

abstract class GenericQuestionData {}
class DataSimple: GenericQuestionData() {}

it doesn't complain if I create this function in GenericQuestionEditor()

fun test() {
    data = DataSimple()
}

Why do I get an error on data in EditorSimple()? It should recognize it as a subtype and it should be allowed as I understand.

I feel like the answer is found in the kotlin documentation but i'm not sure how to configure it in this case since they are not passed values or part of a collection.

Upvotes: 0

Views: 288

Answers (1)

Sweeper
Sweeper

Reputation: 271750

You need to specify the type explicitly:

class EditorSimple(): GenericQuestionEditor() {
    override var data: GenericQuestionData = DataSimple()
}

Without the type annotation, the type of data would be inferred to be DataSimple, which doesn't match the type of its super class' data. Even though the types are related, you can't override writable a property with a subtype. Imagine if I did:

class SomeOtherData: GenericQuestionData()

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

But, editor actually has a EditorSimple, which can only store DataSimple objects in data!

Upvotes: 2

Related Questions