2013-02-25 38 views
0

我想缩小泛型类型。它编译,但结果不是预期的(Container(A),Container(B)..)而不是(Container(A),Container(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() 
    } 

} 
+0

Lars Hupel在scala用户邮件列表上给出了正确的答案。有人可以在这里发布。 – 2013-02-28 20:46:23

回答

1

在此表达T被删除,因此,所有实际检查情况是t是集装箱

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

我想你可以添加一个后卫明确检查t的内容与tag (对不起,现在不知道正确的语法)

+1

不是。如果在范围内有一个'ClassTag [T]',那么2.10中的新模式匹配器也应该自动检查'T'。 – 2013-02-26 09:32:28