如何找出嵌套类型参数

时间:2017-07-05 23:25:47

标签: scala

使用以下代码,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())

  }

2 个答案:

答案 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())
  }