class作为参数,scala。

时间:2013-10-09 20:04:17

标签: scala metaprogramming

作为我的代码的简化版本:

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类型

我不明白。

1 个答案:

答案 0 :(得分:4)

首先,关于附加内容,我建议使用类似ListBuffer而不是LinkedList的内容,它有一个更友好的API可供追加。

接下来,您对clazz参数的声明声明它是T类型(GenX的子类型),而不是Class[T]。无论如何,你最好只在x上进行匹配。

最后,x被声明为类型GenX,并且对于所有编译器可以告诉的可能是GenX的{​​{1}}或子类类型的不同子类。选定的列表,因此您将收到实际的编译错误。

这是一个应该达到你想要的A版本:

clazz