Сопоставление шаблона Scala с манифестом

В этой отличной ежедневной статье о Scala описывается, как преодолеть стирание типов при сопоставлении. Я пытаюсь применить эту технику для преобразования IndexesSeq параметризованных типов, но совпадения не удались. Почему это так и как я могу это исправить?

object Example extends App{
    class TableColumn[T](
        val values: IndexedSeq[T], 
        val name: Option[String] = None
    )(implicit val m: Manifest[T])

    class Def[C](implicit desired : Manifest[C]) {
        def unapply[X](c : X)(implicit m : Manifest[X]) : Option[C] = {
            //println("m.toString+", "+desired.toString)
            def sameArgs = desired.typeArguments.zip(m.typeArguments).forall {
                case (desired,actual) => desired >:> actual
            }
            if (desired >:> m && sameArgs) Some(c.asInstanceOf[C])
            else None
         }
    }

    val IntTableColumn = new Def[TableColumn[Int]]
    val DoubleTableColumn = new Def[TableColumn[Double]]

    class Analysis(data: IndexedSeq[TableColumn[_]]){
        val transformedData = data.map{_ match{
            case IntTableColumn(tc) => println("Column of Int! "+ tc)
            case DoubleTableColumn(tc) => println("Column of Double! "+ tc)
            case _ => println("no match")
        }}
    }

    new Analysis(IndexedSeq(
            new TableColumn(IndexedSeq(1,2,3)),
            new TableColumn(IndexedSeq(1.0,2.0,3.0))
    ))
}

Если я раскомментирую строку в Def, я увижу такие строки, как

prototype.Example$TableColumn[_ <: Any], prototype.Example$TableColumn[Int]

предполагая, что проблема _в конструкторе анализа, но я не знаю, что еще туда добавить.

7
задан Pengin 24 December 2013 в 10:22
поделиться