Скала контравариантности и ковариации

Я поигрался с системой типов 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 <: B](x : B) : A = {
    return x.asInstanceOf[A]
 }
}

Дело 1:

val co = new CoVariance[Point]
val color_point = new ColorPoint(1,2,3,4,5)
val point_co = co.cast(color_point) 
println(point_co.x)

Если я напишу это:

// Covariance[Point] -> 
// 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 <: B](x : B) : Point -> (fill in ColorPoint)
// cast[ColorPoint, Point <: ColorPoint] : Point 

Я также ожидаю, что это будет неправильно, но Скала не жалуется. Я бы сказал, что Point не является подтипом ColorPoint.

Правильно ли мои рассуждения или я что-то упустил?

Ответы на вопрос(2)

Ваш ответ на вопрос