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中的错误?
答案 0 :(得分:1)
正确答案不是scala.Tuple2$mcII$sp
。您在编译时要求Tuple2[Int, Int]
的名义(和已擦除!)类型,即Tuple2
。请注意getClass
是一个非常不同的东西,它会为您提供运行时值的类。