更新:我用一個更小更精確的例子來說明我的問題。以下「非法繼承」(Scala 2.9.2)背後的原因是什麼?
假設,我們有如下定義:
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 = [email protected]
但是我們不能創建下列對象:
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
^
同樣的事情發生時,使用自我類型的性狀而不是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謝謝你的信息。我改述了我的問題。 –
好吧,我會看看。我修正了'性狀TraitForA'的性狀TraitForA延伸A'因爲我認爲這就是你的意思。 –