2016-06-21 68 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]。而已。