使用ClassTag缩小范围

时间:2013-02-25 17:29:43

标签: scala scala-2.10

我正在尝试缩小泛型类型。它编译,但结果不是预期的(容器(A),容器(B)..)而不是(容器(A),容器(A))。 我做错了什么?

sealed trait Base
case class A() extends Base 
case class B() extends Base
case class Container[+T](item: Base)


object Test {
  import scala.reflect.ClassTag

  def narrowContainer[T <: Base](list: List[Container[Base]])(implicit tag: ClassTag[T]): List[Container[T]] = {
      list.collect{ case t: Container[T] => t }
  }  

  def testNarrowContainer(){
       val li = List(A(),B(),A(),B()).map(Container(_))
       println(narrowContainer[A](li))  
       println(narrowContainer[B](li)) 
  }

  def main(args: Array[String]){
      testNarrowContainer()
  }

}

1 个答案:

答案 0 :(得分:1)

在此表达式中T被删除,因此所有案例实际检查的是t是一个容器

{ case t: Container[T] => t }

我认为你可以添加一个警卫,明确地检查ttag的内容(对不起,现在不知道正确的语法)