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

为什么Scala编译器说逆向类型A出现在类型>中的协变位置:A &l

发布时间:2020-12-16 18:47:18 所属栏目:安全 来源:网络整理
导读:编译器告诉我这不能带有以下警告:“逆变类型A出现在类型中的协变位置:A:任何类型B”警告位于compose方法的type参数中.从逻辑上讲,类型定义对我来说很有意义.如果编译器没有问题,那么为什么问题与converse有关? trait Foo[-A]{ def compose[B : A](t: Foo
编译器告诉我这不能带有以下警告:“逆变类型A出现在类型>中的协变位置:A<:任何类型B”警告位于compose方法的type参数中.从逻辑上讲,类型定义对我来说很有意义.如果编译器没有问题,那么为什么问题与converse有关?

trait Foo[-A]{
  def compose[B >: A](t: Foo[B]): Foo[A] = t andThen this
  def andThen[B <: A](t: Foo[B]): Foo[B]
}

我所需要的只是一个破坏的例子.然后我很高兴.

解决方法

如错误所示,您的方差注释是错误的.您不能在返回类型中使用A,这是一个协变位置.想象一下,你在Foo中有另一种方法,它使用A在适当的逆变位置(作为参数):

trait Foo[-A] {
  ...
  def foo(a: A): Unit
}

现在你可以看到这是如何崩溃的:

> Foo [-A]暗示Foo [X]<:Foo [Y]如果X>:Y
>返回值可以是声明的返回类型的子类型
>因此,如果-A在这里是合法的,compose可能会为某些A1>:A返回Foo [A1]
>说特质X和特质Y延伸X {def bar()}
>想象一个Foo [Y],其中foo调用a.bar()
>因此如果compose被允许返回Foo [X]会破坏

因此,对于您编译的示例,A必须是不变的.

(编辑:李大同)

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

    推荐文章
      热点阅读