Скала контравариантности и ковариации
Я поигрался с системой типов scala и обнаружил странный случай. У меня есть веская причина верить, я нене понимаю ковариантности и ковариации.
Это мой проблемный случай:
У меня есть два класса, Point и ColorPoint, который является подклассом Point.
class Point(val x : Int, val y : Int)
class ColorPoint(x : Int, y : Int, val red : Int, val green : Int, val blue : Int) extends Point(x,y)
Этот класс приводит B к A, в то время как B должен быть супертипом A:
class CoVariance[+A]{
def cast[B >: A](x : B) : A = {
return x.asInstanceOf[A]
}
}
Этот класс приводит B к A, в то время как B должен быть супертипом A:
class ContraVariance[-A]{
def cast[B, A
// cast[B :> Point](x : B) : Point -> (fill in ColorPoint)
// Cast[ColorPoint :> Point] : Point
Я ожидаю, что это будет неправильно, потому что ColorPoint не является супертипом Point, но scala нене жалуюсь
Следующий:
val contra = new ContraVariance[Point]
val color_point_contra = new ColorPoint(1,2,3,4,5)
val point_contra = contra.cast(color_point_contra)
println(point_contra.x)
Если я напишу это:
// ContraVariance[Point] ->
// cast[B, Point (fill in ColorPoint)
// cast[ColorPoint, Point