假設我有兩個A和B類,B是A的一個子類型。顯然,這只是更豐富類型層次結構的一部分,但我認爲這不是相關的。假設A是層次結構的根。有一個集合類C跟蹤A的列表。但是,我想使C通用,這樣就有可能創建一個只保留B而不接受A的實例。雙向關聯中的泛型
class A(val c: C[A]) {
c.addEntry(this)
}
class B(c: C[A]) extends A(c)
class C[T <: A]{
val entries = new ArrayBuffer[T]()
def addEntry(e: T) { entries += e }
}
object Generic {
def main(args : Array[String]) {
val c = new C[B]()
new B(c)
}
}
以上明顯得到錯誤代碼 '類型不匹配:實測值C [B],需要C [A]' 的new B(c)
線。
我不知道如何解決這個問題。在T中不可能產生C協變(如C[+T <: A]
),因爲ArrayBuffer在T中是非變化類型的。不可能使B的構造函數需要C [B],因爲C不能是協變的。
我在這兒吠錯了樹嗎?我是一個完整的Scala新手,所以任何想法和提示可能會有所幫助。謝謝!
編輯: 基本上,我想有是編譯器可同時接收
val c = new C[B]()
new B(c)
和
val c = new C[A]()
new B(c)
,但會拒絕
val c = new C[B]()
new A(c)
這也可能是可能的放寬在C中的ArrayBuffer的鍵入爲A而不是T,從而在C中addEntry方法,如果有幫助的話。
如果C是協變的,它確實出現了你在這裏描述的原因,但這不是嚴格的要求。我不認爲有必要使C [B]成爲C [A]的一個子類型。 – Verhoevenv 2011-01-10 17:57:42