是否可以使用classTag匹配元组类型?

时间:2015-09-03 17:19:44

标签: scala reflection

如果A是TypeTag,则以下条件也会尝试匹配Tuple2的内部类型,即String和Int。

if (typeOf[A] == typeOf[Int])
    ...
else if (typeOf[A] == typeOf[Tuple2[String, Int]])
    ...

如果A是ClassTag,则以下条件将匹配Tuple2但不匹配内部类型。

if (classTag[A] == classTag[Int])
    ...
else if (classTag[A] == classTag[Tuple2[String, Int]])
    ...

有没有办法使用ClassTag匹配元组的内部类型?

1 个答案:

答案 0 :(得分:4)

ClassTag,没有。 ClassTag仅存储有关的信息。在Tuple2[A, B]中,类型参数AB不是类信息,它们是类型信息。也就是说,Tuple2是类,Tuple2[A, B]是类型。因此TypeTag应该用于比较。 实际上Type中包含的TypeTag应该用于比较。

因此,如果A = (A1, A2),那么classTag[A]只知道ATuple2,但对A1A2一无所知

另外需要注意的是,在比较类型标记时,您应该使用=:=,它会在比较之前对其进行解除别名。

scala> type IS = (Int, String)
defined type alias IS

scala> typeTag[IS] == typeOf[(Int, String)]
res18: Boolean = false

scala> type IS = (Int, String)
defined type alias IS

scala> typeTag[IS] == typeTag[(Int, String)]
res19: Boolean = false

scala> typeOf[IS] == typeOf[(Int, String)]
res20: Boolean = false

scala> typeOf[IS] =:= typeOf[(Int, String)]
res21: Boolean = true // only =:= produces what one would expect on comparing types