我定期与在使用基元参数化的泛型类中检查运行时类型一致性的问题发生冲突。假设
private def runtimeTypeOf(o :Any) =
runtimeMirror(getClass.getClassLoader).classSymbol(o.getClass).toType
class TupleType[T1 :TypeTag, T2 :TypeTag] {
def unapply(o :Any) = o match {
case (v1, v2) if runtimeTypeOf(v1) <:< typeOf[T1] && runtimeTypeOf(v2) <:< typeOf[T2] => Some()
case _ => None
}
}
val LongString = new TupleType[Long, String]
(1L, "2") match { case LongString() => true; case _ => false }
上方匹配将返回false,因为v1
为java.lang.Long
,而typeOf[T1]
只是scala Long
。
无论如何从typeOf[T1]
获取盒装的运行时类型?