加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何理解“方法参数的方差位置与封闭参数子句的方差位

发布时间:2020-12-16 18:04:50 所属栏目:安全 来源:网络整理
导读:我看到这句话是 scala specification (pdf): The variance position of a method parameter is the opposite of the variance position of the enclosing parameter clause. 这是第44页. 但我不太明白.你能给我一些样品吗? 解决方法 所以,让我们从一个激励
我看到这句话是 scala specification (pdf):

The variance position of a method parameter is the opposite of the variance position of the enclosing parameter clause.

这是第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) = ???
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读