使用以下代码,new Box(10), new Box("20")
对我很有用。但是对于new Box(Seq(20)), new Box(Seq("20")))
,
我想弄清楚Seq的类型参数的类型,以便我可以打印Seq [Int],Seq [String]
@Test
def testClassTag(): Unit = {
class Box[T:ClassTag](val data: T) {
def printTypeParameter() = {
val tag = implicitly[ClassTag[T]].runtimeClass
tag match {
case _ if tag == classOf[Int] => println("Int")
case _ if tag == classOf[String] => println("String")
case _ if tag == classOf[Seq[_]] => println( "Seq")
}
}
}
val boxes = Seq(new Box(10), new Box("20"), new Box(Seq(20)), new Box(Seq("20")))
boxes.foreach(_.printTypeParameter())
}
答案 0 :(得分:1)
新的正确方法是使用TypeTag
代替ClassTag
:
def foo[T : TypeTag](data: T) = typeOf[T] match {
case t if t =:= typeOf[Int] => println("Int")
case t if t =:= typeOf[String] => println("String")
case t if t <:< typeOf[Seq[String]] => println("Seq[String]")
// etc
}
(如果你只想打印出来,你也可以这样做:
def foo[T : TypeTag](data: T) = println(typeOf[T])`
它做同样的事情,但处理所有类型,而不仅仅是你能想到的类型。
答案 1 :(得分:1)
@ dima的答案很优雅,我会采用另一种方法逐步检测类型参数。
@Test
def testTypeTag1(): Unit = {
class Box[T: TypeTag](val data: T) {
def printTypeParameter() = {
typeOf[T] match {
case t if t =:= typeOf[Int] => println("Int")
case t if t =:= typeOf[String] => println("String")
case t if t <:< typeOf[Seq[Any]] => {
val TypeRef(_, _, Seq(elementType)) = typeOf[T]
elementType match {
case t if t =:= typeOf[Int] =>println("Seq[Int]")
case t if t =:= typeOf[String] =>println("Seq[String]")
case _=>println("Seq[Unknown]")
}
}
case _ => println("Unknown")
}
}
}
val boxes = Seq(new Box(10), new Box("20"), new Box(Seq(20)), new Box(Seq("20")))
boxes.foreach(_.printTypeParameter())
}