2016-06-21 69 views
1

以下示例摘自Programming in Scala,2nd Edition。 我的疑問是爲什麼在下面的語句中提到了兩個翻轉「這個參數中的U型再次處於正位置(兩翻轉)」?Scala類型方差示例

喵方法結果參數的位置是+。因此,Cat [Cat [U,T],U]中的Cat [U,T]將具有 - 位置,因爲在Cat類的類型參數T中聲明爲-ve。

規則說,在C [參數],精氨酸的分類將翻轉如果C的類型參數聲明 - 像C [-Q]

應用該規則ü這應該是 - 將被翻轉+。所以只有翻轉。這本書中的段落中提到的U怎麼翻轉?

abstract class Cat[-T, +U] { 

    def meow[W−](volume: T−, listener: Cat[U+, T−]−) 
    : Cat[Cat[U+, T−]−, U+]+ 

} 

類型參數,W,並且兩個值參數,體積和聽者的位置,都是負的。查看喵的結果類型,第一個Cat [U,T]參數的位置是負數,因爲Cat的第一個類型參數T用 - 標註。該參數內部的類型U再次處於正位置(兩次翻轉),而該參數內部的類型T仍處於負位置。

回答

1

U是在Cat[U, T]負位置,其本身在Cat[Cat[U,T],U]負位置。兩個負面消息在這裏給予肯定,就像(-1)*(-1) == 1。應該很容易理解爲什麼:考慮兩種類型AB,使BA(簡稱B <: A)的子類型。然後Cat[B, T] >: Cat[A, T]對於任何類型T(這正是反轉意味着什麼)。然後Cat[Cat[B, T], S] <: Cat[Cat[A, T], S]。而已。