Scala Pattern Matching

This great Scala daily article describes how to overcome style erasure when matching. I am trying to apply a technique to convert IndexesSeq parameterized types, but no matches are made. Why is this and how can I fix it?

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

If I uncomment a line in Def, I see lines like

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

assuming _ in the Analysis constructor is a problem, but I don't know what else to add.

+7
source share
1 answer

Thanks to Rex Kerr's comments, I have combined what I think works. This can probably be done more elegantly / in general, but it seems to be doing it now:

 object Example extends App{ class TableColumn[T]( val values: IndexedSeq[T], val name: Option[String] = None )(implicit val m: Manifest[T]) class TableColumnMatcher[T](implicit desired: Manifest[T]){ def unapply(tc: TableColumn[_]): Option[TableColumn[T]] = { if(tc.m == desired) Some(tc.asInstanceOf[TableColumn[T]]) else None } } object TableColumnMatcher{ lazy val IntTC = new TableColumnMatcher[Int] lazy val DoubleTC = new TableColumnMatcher[Double] } class Analysis(data: IndexedSeq[TableColumn[_]]){ import TableColumnMatcher._ val transformedData = data.map{_ match{ case IntTC(tc) => println("Column of Ints!"); case DoubleTC(tc) => println("Column of Doubles!") case _ => println("no match") }} } new Analysis(IndexedSeq( new TableColumn(IndexedSeq(1,2,3)), new TableColumn(IndexedSeq(1.0,2.0,3.0)) )) } 
+1
source

All Articles