05.協變與逆變

covariance and contravariance


協變(Co-variance)


將子類別的容器指派給上層類別容器的能力稱之.


逆變(Contra-variance)


將父類別的容器指派給子類別容器的能力稱之.



參數化類型的可變性


Scala 對協變與逆變在預設行為下是都不支持的, 但我們仍希望能夠處於慎重地情境中, 將子類別類型的容器, 把它視為其上層類型的容器類.


scala> var ar1 = new Array[Int](3)
ar1: Array[Int] = Array(0, 0, 0)

scala> var ar2: Array[Any] = null             
ar2: Array[Any] = null

scala> ar2 = ar1
<console>:7: error: type mismatch;
 found   : Array[Int]
 required: Array[Any]
       ar2 = ar1
             ^


[T <: BaseClass]


T 必須為 BaseClass 的子類別, 屬 上界 的語法



[S, D >: S]


目的陣列的參數化類型 D 限制為來源陣列的參數化 S 的上層類型, 用以設定 下界.



[+T]


把子類型的容器當成 Base class 的容器, 來達到協變的效果.


[-T]


逆變


Comments