1. 程式人生 > >(轉)Scala中協變(+)、逆變(-)、上界(<:)、下界(>:)簡單介紹

(轉)Scala中協變(+)、逆變(-)、上界(<:)、下界(>:)簡單介紹

定義類 word ref 一個 pla 而不是 關系 repl 協變

看源碼的時候看到:

trait ExtensionId[T <: Extension] {

沒見過這個符號啊<:

Scala上界(<:)和下界(>:)

1) U >: T

這是類型下界的定義,也就是U必須是類型T的父類(或本身,自己也可以認為是自己的父類)。

2) S <: T

這是類型上界的定義,也就是S必須是類型T的子類(或本身,自己也可以認為是自己的子類)。

然後scala中的泛型符號是[T],而不是Java中的<T>.

對於一個帶類型參數的類型,比如 List[T],如果對A及其子類型B,滿足 List[B]也符合List[A]的子類型,那麽就稱為covariance(協變) ,

如果 List[A]是 List[B]的子類型,即與原來的父子關系正相反,則稱為contravariance(逆變)。

如果一個類型支持協變或逆變,則稱這個類型為variance(翻譯為可變的或變型),否則稱為invariance(不可變的)

而Scala支持,可以在定義類型時聲明(用加號表示為協變,減號表示逆變),如:

tarit Person[+T]{} --協變,在這種情況下,假設S類型是A類型的子類,則Person[S]類型可泛化成Person[T]的子類,也就是被參數化類型的泛化方向與參數類型的方向是一致的,所以稱為協變。

tarit Person[-T]{} --逆變,這種情況下,當類型S是類型A的子類型,則Person[A]反過來可以認為是Person[S]的子類型。也就是被參數化類型的泛化方向與參數類型的方向是相反的,所以稱為逆變

...

http://blog.csdn.net/w517424787/article/details/51201468

(轉)Scala中協變(+)、逆變(-)、上界(<:)、下界(>:)簡單介紹