我知道,SO上有很多问题都有相同的标题,而且我确实理解这个错误的含义一般,但这让我很困惑:
trait Foo[A] { type F = A; def stuff(a: F): Unit; def mk(s: String): F }
abstract class Bar { self: Foo[_] => def moreStuff(a: F): Unit }
第一行很好,但第二行没有编译: "协变类型_ $ 1出现在Bar.this.F类型的逆变位置,值为a"
我无法理解这一点。
为什么认为F
是协变的?它是A
的别名,它是不变的......
如果F
是协变的,为什么声明stuff(a: F)
的第一行不会抱怨它处于逆变位置?
如果我摆脱了type参数,并使F
抽象,那么它可以工作:
trait Foo { type F; def stuff(a: F): Unit; def mk(s: String): F }
class Bar { self: Foo => def moreStuff(a: F) = println(a) }
这与上面基本相同。为什么要编译,另一件事没有?
另外,如果我保留Foo
的定义,还要参数化Bar
,那也会编译:
class Bar[A] { self: Foo[A] => def moreStuff(a: F): Unit }
我真的想让第一个表单起作用。有没有办法说服编译器F
真的不变?