2013-02-25 39 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