1

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

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)
}

现在的问题是编译器抱怨 x 是 GenX 类型而不是 _$1 <: GenX 类型

我不明白。

4

1 回答 1

4

首先,关于附加,我建议使用 aListBuffer而不是 a之类的东西LinkedList,它有一个更友好的附加 API。

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

最后,x被声明为 type GenX,并且编译器可以告诉它可能是GenXfrom的不同子类clazz或所选列表的子类类型,因此您会收到实际的编译错误。

这是 A 的一个版本,应该可以实现您的目标:

import scala.collection.mutable.ListBuffer

class A {
  val ab : ListBuffer[X1] = ListBuffer()
  val ac : ListBuffer[X2] = ListBuffer()
  // ...

  def addX(x: GenX) = x match {
    case x1: X1 => ab += x1
    case x2: X2 => ac += x2
    // ...
  }         
}
于 2013-10-09T21:46:43.003 回答