scala – 如何理解“方法参数的方差位置与封闭参数子句的方差位
我看到这句话是
scala specification (pdf):
这是第44页. 但我不太明白.你能给我一些样品吗? 解决方法
所以,让我们从一个激励人心的例子开始吧.假设我写了以下内容:
class Foo[+A] { def foo(a : A) = ??? } 现在,通过用a注释类型参数A,我已经声明Foo在A中是协变的,也就是说如果X<:Y,那么Foo [X]<:Foo [Y].所以,假设我有这样一个Foo [X],我试着将它传递给一个需要Foo [Y]的函数: def bar(a : Y,x : Foo[Y]) = { x.foo(a) } 现在,bar尝试用Y调用x.foo.但是x是Foo [X],而X是Y的子类型 – 所以它就像尝试将Object传递给需要String的函数 – 不能保证对象包含执行此操作所需的所有内容.所以上面Foo的定义是无效的 – 要使用规范中的术语,类型参数A是协变的,但是你试图在逆变位置使用它 – 作为函数的参数. 您引用的Scala规范中规定的规则集是Scala编译器用于确定代码中不同位置的方差位置的规则,它用于检查您是否未执行任何类似定义的操作上面的Foo.您标识的特定子句给出了与上述示例相对应的规则 – 它表示参数子句的方差位置(例如,在函数的参数列表中)与周围的方差位置相反. 通常,这意味着参数子句是逆变的.然而,事情可以多次反转: class Foo[A,B] { def foo(a : A) = { def bar(b : B) = ??? } } 这里,foo的参数子句是逆变的,因此bar的参数子句再次被反转,并且是协变的.所以以下定义是有效的: class Foo[-A,+B] { def foo(a : A) = { def bar(b : B) = ??? } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |