Given the following code:
class ChipsPane[A <: ChipsPane.ChipValue] {
def add(a: A): Unit = ???
val chip = new ChipsPane.ChipValue {
override def label = "???"
}
add(chip)
}
object ChipsPane {
trait ChipValue {
def label: String
}
}
For this code I get the following compiler error:
type mismatch;
found : ChipsPane.ChipValue
required: A
add(chip)
But if I replace add(chip) with add(chip.asInstanceOf[A]), everything works fine.
Can anyone tell me what’s wrong with my code?
There’s some subtype A of ChipValue (which may be ChipsValue itself, but could be a real subtype) which is provided upon instantiation of ChipsPane. Now inside ChipsPane you assume that A =:= ChipValue. Consider MyChipValue extends ChipValue and new ChipsPane[MyChipValue], though - the assumption doesn’t hold.
2 Likes
I am pretty sure that I don’t understand what you try to explain me. (My fault).
I expected that A must be any subtype of ChipValue and chip is clearly a subtype of ChipValue, isn’t it?
A can be any subtype of ChipValue (or ChipValue itself), but for a given instance of ChipsPane it is a specific subtype of ChipValue (or ChipValue itself) that is provided upon instantiation. For new ChipsPane[MyChipValue], A is bound to MyChipValue, and chip clearly is not of type MyChipValue.
2 Likes