Why can the type of an overridden property be chan...
# getting-started
a
Why can the type of an overridden property be changed to a subtype, but only if the property is a
val
, not a
var
?
Copy code
sealed interface ParentType
class SubTypeA : ParentType
class SubTypeB : ParentType

sealed interface DataHolder1 {
  var data: ParentType

  // ERROR: Type of 'data' doesn't match the type of the overridden 'var' property 'var data: ParentType' defined in 'DataHolder1'.
  class HolderA(override var data: SubTypeA) : DataHolder1
  // ERROR: Type of 'data' doesn't match the type of the overridden 'var' property 'var data: ParentType' defined in 'DataHolder1'.
  class HolderB(override var data: SubTypeB) : DataHolder1
}

sealed interface DataHolder2 {
  val data: ParentType

  // but the type of `val` properties can be changed?
  class HolderA(override val data: SubTypeA) : DataHolder2
  class HolderB(override val data: SubTypeB) : DataHolder2
}
https://pl.kotl.in/esiw_FX5H
oh, I see, because it breaks typesafety, it's possible to assign the wrong value:
Copy code
val dh: DataHolder1 = DataHolder1.HolderA(SubTypeA())
// assigning B to A should be forbidden!
dh.data = SubTypeB()
👌 3
👍 1
rubber duck 1
💯 1