gpt4 book ai didi

scala - 如何理解 "The variance position of a method parameter is the opposite of the variance position of the enclosing parameter clause."

转载 作者:行者123 更新时间:2023-12-02 05:59:12 25 4
gpt4 key购买 nike

我看到这句话是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.fooY 。但是xFoo[X] ,和XY 的子类型- 所以这就像试图通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com