更新:我用一个更小更精确的例子重新表述了我的问题。
假设我们有以下定义:
class A
trait TraitForA extends A
class D[T]
trait TraitForD extends D[A]
然后我们可以创建一个对象,如:
scala> new D[A] with TraitForD
res0: D[A] with TraitForD = $anon$1@145d424
但是我们不能创建以下对象:
scala> new D[A with TraitForA] with TraitForD
<console>:12: error: illegal inheritance;
anonymous class $anon inherits different type instances of class D:
D[A] and D[A with TraitForA]
new D[A with TraitForA] with TraitForD
^
当使用 self 类型而不是 trait 时,也会发生同样的事情extends
:
scala> trait TraitForD2 { self: D[A] => }
defined trait TraitForD2
scala> new D[A with TraitForA] with TraitForD2
<console>:12: error: illegal inheritance;
self-type D[A with TraitForA] with TraitForD2 does not conform to TraitForD2's
selftype TraitForD2 with D[A]
new D[A with TraitForA] with TraitForD2
^
上面的创作(确切地说)有什么问题?
我的猜测是,这D[A with TraitForA]
不被视为 type D[A]
。+T
在 class 中使用协变注释时D
,两个示例都有效。
有人可以解释这些例子失败的原因以及它们为什么要使用+T
吗?
额外的问题:有没有办法让示例在没有的情况下运行+T
?