逆变位置的协变类型(具体情况)

时间:2016-12-10 21:33:21

标签: scala covariance

我知道,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真的不变?

0 个答案:

没有答案