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)) )) }
Pengin
source share