抱歉,我已经问了一些这样的问题,但我仍然无法得到明确的答案,也许我糟糕的英语和不清晰的表达让好心人感到困惑。
当我读到《类型参数化》这篇文章时:http://www.artima.com/pins1ed/type-parameterization.html,我看到有一些关于类型位置的解释:
作为一个有点人为的示例,请考虑以下类定义,其中多个位置的方差用 ^+(表示正数)或 ^-(表示负数)进行注释:
abstract class Cat[-T, +U] {
def meow[W^-](volume: T^-, listener: Cat[U^+, T^-]^-)
: Cat[Cat[U^+, T^-]^-, U^+]^+
}
我能理解这堂课的大部分内容,除了W
位置。我不明白为什么它标记为negative,并且整个文档没有任何解释。
它还说:
用+注释的类型参数只能用在正数位置,而用-注释的类型参数只能用在负数位置。
我怎样才能找到一个类型-
注释就位W
适应这个消极的立场?
语言参考说:
- 方法参数的方差位置与封闭参数子句的方差位置相反。
- 类型参数的方差位置与封闭类型参数子句的方差位置相反。
- 类型声明或类型参数下界的方差位置与类型声明或参数的方差位置相反。
好的,类型参数具有方差位置意味着什么?
class Moo[+A, -B] {
def foo[X] (bar : Y) ...
所以Y处于逆变位置,这一点很清楚。我们可以把B放在它的位置上,但不能把A放在它的位置上。
但是 X 处于逆变位置意味着什么呢?我们不能替换 A 或 B 或那里的任何东西,它只是一个形式参数!
确实如此,但是这件事可以有从属职位它们是类型,并且具有方差。因此,在跟踪方差翻转次数时,我们需要计算 X 的位置。这里没有 X 的从属子句,但请考虑一下:
class Moo[+A, -B] {
def foo[X >: Z] (bar : B) ...
我们或许可以用 A 或 B 来代替 Z,但是哪个是正确的呢?嗯,Z的位置和X的位置相反,X的位置和顶层的位置相反,是协变的,所以Z也一定是协变的。让我们检查:
abstract class Moo[+A, -B] {
def foo[X >: A] (bar : B)
}
defined class Moo
看来我们是对的!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)