- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看到这句话是scala specification (pdf) :
The variance position of a method parameter is the opposite of the variance position of the enclosing parameter clause.
位于第 44 页。
但是我不太明白。能给我一些 sample 吗?
最佳答案
那么,让我们从一个激励人心的例子开始。假设我写了以下内容:
class Foo[+A] {
def foo(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
尝试调用 x.foo
与 Y
。但是x
是 Foo[X]
,和X
是 Y
的子类型- 所以这就像试图通过 Object
到需要 String
的函数- 不能保证 Object
包含执行此操作所需的一切。所以 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) = ???
}
}
关于scala - 如何理解 "The variance position of a method parameter is the opposite of the variance position of the enclosing parameter clause.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23427270/
我是一名优秀的程序员,十分优秀!