gpt4 book ai didi

scala - 为什么Scala编译器说逆变类型A出现在类型> : A <: Any of type B?的协变位置

转载 作者:行者123 更新时间:2023-12-04 15:24:25 26 4
gpt4 key购买 nike

编译器告诉我这不能带有以下警告:“逆变类型 A 出现在类型 >: A <: 任何类型 B 中的协变位置。”警告位于 compose 方法的类型参数中。从逻辑上讲,类型定义对我来说很有意义。如果编译器对 andThen 没有疑虑,那么为什么反过来会出现问题?

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是错的。您不能使用 A在作为协变位置的返回类型中。想象一下你在 Foo 中有另一个方法使用 A在适当的逆变位置(作为参数):

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

现在你可以看到它是如何崩溃的:
  • Foo[-A]意味着 Foo[X] <: Foo[Y]如果 X >: Y
  • 返回值可能是声明的返回类型的子类型
  • 因此,如果 -A在这里是合法的,compose可能会返回 Foo[A1]一些 A1 >: A
  • trait Xtrait Y extends X { def bar() }
  • 想象一个 Foo[Y]哪里foo电话a.bar()
  • 因此,如果 compose 会中断被允许返回 Foo[X]

  • 所以对于你编译的例子, A必须是不变的。

    关于scala - 为什么Scala编译器说逆变类型A出现在类型> : A <: Any of type B?的协变位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14678518/

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