【发布时间】:2012-06-28 22:24:09
【问题描述】:
更新:我用一个更小更精确的例子重新表述了我的问题。
假设,我们有以下定义:
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 类型而不是 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] 不被视为类型 D[A]。在 D 类中使用协变注释 +T 时,这两个示例都有效。
有人可以解释示例失败的原因以及它们与+T 合作的原因吗?
额外问题:有没有办法让示例在没有 +T 的情况下运行?
【问题讨论】:
-
我认为您的解释大部分是正确的。还要考虑到类型参数会被擦除,因此您不可能将相同的特征与两个不同的类型参数混合在一起。我不明白你的最后一句话(部分原因是它有语法问题),也许澄清一下,因为这最终似乎是你的问题。
-
@Sciss 谢谢你的信息。我重新表述了我的问题。
-
好的,我去看看。我将
trait TraitForA更正为trait TraitForA extends A,因为我认为这就是你的意思。
标签: scala inheritance traits type-erasure type-parameter