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

sav*_*ava 3 reflection scala

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

if (typeOf[A] == typeOf[Int])
    ...
else if (typeOf[A] == typeOf[Tuple2[String, Int]])
    ...
Run Code Online (Sandbox Code Playgroud)

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

if (classTag[A] == classTag[Int])
    ...
else if (classTag[A] == classTag[Tuple2[String, Int]])
    ...
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*jac 5

有了ClassTag,不。A只存储有关该类的ClassTag信息。在 中,类型参数和不是类信息,它们是类型信息。即,是类,是类型。因此应该用来比较。实际上,应该用中包含的来进行比较。Tuple2[A, B]ABTuple2Tuple2[A, B]TypeTagTypeTypeTag

因此,如果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
Run Code Online (Sandbox Code Playgroud)