如果A是TypeTag,则以下条件也将尝试匹配Tuple2的内部类型,即String和Int。
if (typeOf[A] == typeOf[Int])
...
else if (typeOf[A] == typeOf[Tuple2[String, Int]])
...
如果A是一个classstag,下面的条件将匹配到Tuple2,但不匹配内部类型。
if (classTag[A] == classTag[Int])
...
else if (classTag[A] == classTag[Tuple2[String, Int]])
...
是否有一种方法来匹配使用ClassTag元组的内部类型?
带ClassTag
,无。ClassTag
只存储类的信息。在Tuple2[A, B]
中,类型参数A
和B
不是类信息,而是类型信息。也就是说,Tuple2
是类,Tuple2[A, B]
是类型。因此,应该使用TypeTag
进行比较。实际上应该使用TypeTag
中包含的Type
进行比较。
因此,如果A = (A1, A2)
,那么classTag[A]
只知道A
是Tuple2
,而不知道A1
和A2
。
另一个注意事项,当比较类型标记时,您应该使用=:=
,它将在比较之前取消它们的别名。
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