作为我的代码的简化版本:
abstract class GenX
case class X1 extends GenX
case class X2 extends GenX
...
class A {
val ab : LinkedList[X1] = LinkedList()
val ac : LinkedList[X2] = LinkedList()
...
def addX[T <: GenX]( x : GenX, clazz : T) =
getList(clazz) append LinkedList(x) // HERE complains
def getList(T <: GenX) (clazz : T) : LinkedList[_<: GenX] = clazz match {
case X1 => ab
case X2 => ac
...
}
}
我的意图是,当需要将GenX添加到A时,它可以将其类作为参数传递给像
这样的通用添加case class X1 extends GenX{
def addToA(a : A) = a.addX(this, this getClass)
}
现在的问题是编译器抱怨xout是GenX类型而不是_ $ 1&lt;:GenX类型
我不明白。
答案 0 :(得分:4)
首先,关于附加内容,我建议使用类似ListBuffer
而不是LinkedList
的内容,它有一个更友好的API可供追加。
接下来,您对clazz
参数的声明声明它是T
类型(GenX
的子类型),而不是Class[T]
。无论如何,你最好只在x
上进行匹配。
最后,x
被声明为类型GenX
,并且对于所有编译器可以告诉的可能是GenX
的{{1}}或子类类型的不同子类。选定的列表,因此您将收到实际的编译错误。
这是一个应该达到你想要的A版本:
clazz