假设我有两个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