2017-07-06 9 views
1

の要素の型を取得するために、私はSeq[AnyRef]の要素の型をチェックする、使用ClassTagとTypeTag次のテストケースを伴う配列[AnyRef]

@Test 
    def testClassTagAndTypeTag(): Unit = { 
    import scala.reflect.runtime.universe._ 
    def getTypeTag[T: TypeTag](data: T): TypeTag[T] = typeTag[T] 
    def getClassTag[T: ClassTag](data: T): ClassTag[T] = implicitly[ClassTag[T]] 
    val data = Seq(List(1), "Hello", new Box(1)) 
    data.foreach(x => { 
     println(s"TypeTag: ${getTypeTag(x)}, tpe: ${getTypeTag(x).tpe}") 
    }) 
    data.foreach(x => { 
     println(s"ClassTag: ${getClassTag(x)}") 
    }) 
    } 

上記のコードの出力であります:

TypeTag: TypeTag[java.lang.Object], tpe: java.lang.Object 
TypeTag: TypeTag[java.lang.Object], tpe: java.lang.Object 
TypeTag: TypeTag[java.lang.Object], tpe: java.lang.Object 
ClassTag: Object 
ClassTag: Object 
ClassTag: Object 

私はタイプのタグが出力

List[Int] 
String 
Box[Int] 
あるべき配列の要素の実数型をべきであると考え

答えて

2

あなたはSeq[AnyRef]の時間が過ぎると、それは遅すぎます。 xのタイプはであり、AnyRefであるため、getTypeTag(x)getClassTag(x)は対応する結果を示します。

代わりに、タイプタグを値と共に保存することができます。

case class WithTypeTag[A](x: A)(implicit val tag: TypeTag[A]) 

val data = Seq(WithTypeTag(List(1)), WithTypeTag("Hello"), WithTypeTag(new Box(1))) 
data.foreach(x => println(x.tag)) 
+0

ありがとうございました。役立つ答えは@ alexey-romanovです。しかし、私はそれがとても単純なケースのためにとても複雑であることを少し驚いています... – Tom

関連する問題