更新:澄清和擴大,因爲原來的問題是太遠簡化斯卡拉遞歸仿製藥:父母(孩子)和兒童[家長]
我需要一雙特質,每個指另一方面,父母和孩子的班級必須相互關聯。
trait Parent [C <: Child] {
def foo(c: C)
}
trait Child [P <: Parent] {
def parent: P = ...
def bar = parent.foo(this)
}
,從而實現類必須成對出現:
class ActualParent extends Parent [ActualChild] {
def foo(c: ActualChild) = ...
}
class ActualChild extends Child [ActualParent] {
}
不幸的是,編譯器不會因爲泛型類型是不完整喜歡這些特質。而不是C <: Child
它需要說C <: Child[
東西]
。使他們不明無法正常工作或:
trait Parent [C <: Child[_]] {
def foo(c: C)
}
trait Child [P <: Parent[_]] {
def parent: P = ...
def bar = parent.foo(this)
}
現在抱怨的parent.foo(this)
行,因爲它不知道this
是正確的類型。 parent
的類型需要爲Parent[this.type]
,才能撥打foo
以獲得正確的類型。
我在想一定有一種方法來引用一個對象的類型?或者是一個需要它自己的類型?
更新:繼@丹尼爾的回答,我試着用孩子中一個抽象類型成員陳述泛型類型這樣的父類型:
trait Parent [C <: Child] {
def foo(c: C)
}
trait Child {
type P <: Parent[this.type]
def parent: P = ...
def bar = parent.foo(this)
}
這ISN當我嘗試實現它時不工作:
class ActualParent extends Parent [ActualChild] {
def foo(c: ActualChild) = ...
}
class ActualChild extends Child {
type P = ActualParent
}
給出以下錯誤:
overriding type Parent in trait Child with bounds >: Nothing <: Parent[ActualChild.this.type]
type Parent has incompatible type
這是什麼意思?
看起來正確。現在你將如何擴展到包含父母 - >孩子 - >孩子的鏈條? – 2010-10-08 07:46:35
這種方法很成功,但我不太滿意。我不確定我能夠充分解釋原因。 – 2010-10-08 16:06:39