如何获得专业类型的ClassTag?

时间:2014-06-27 20:37:23

标签: scala

scala> val i = (0, 0)
i: (Int, Int) = (0,0)

scala> i.getClass
res0: Class[_ <: (Int, Int)] = class scala.Tuple2$mcII$sp

scala> def f[T: reflect.ClassTag](t: T) = implicitly[reflect.ClassTag[T]]
f: [T](t: T)(implicit evidence$1: scala.reflect.ClassTag[T])scala.reflect.ClassTag[T]    

scala> f(i)
res1: scala.reflect.ClassTag[(Int, Int)] = scala.Tuple2

隐式ClassTag参数错误。 scala.Tuple2不是i的类。 ClassTag正确scala.Tuple2$mcII$sp

这种行为对我们来说是一个问题,因为我们使用Kryo进行序列化。您向Class提供readObject参数。当我们从ClassTag中取出它时,我们为专门的类提供了错误的类。然后我们读垃圾。

我使用ClassTag错了吗?或者这是Scala 2.11.0中的错误?

1 个答案:

答案 0 :(得分:1)

正确答案不是scala.Tuple2$mcII$sp。您在编译时要求Tuple2[Int, Int]的名义(和已擦除!)类型,即Tuple2。请注意getClass是一个非常不同的东西,它会为您提供运行时值的类。