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

}
4

1 に答える 1

1

この式Tでは消去されるため、実際にチェックされるtのはコンテナであるということだけです。

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

tの内容を明示的にチェックするガードを追加できると思いますtag(申し訳ありませんが、現時点では正しい構文がわかりません)

于 2013-02-26T09:08:41.530 に答える