如何获取专用类型的类标签? scala>vali=(0,0) i:(Int,Int)=(0,0) scala>i.getClass res0:Class[def f[T:reflect.ClassTag](T:T)=隐式地[reflect.ClassTag[T]] f:[T](T:T)(隐式证据$1:scala.reflect.ClassTag[T])scala.reflect.ClassTag[T] scala>f(i) res1:scala.reflect.ClassTag[(Int,Int)]=scala.Tuple2
隐式如何获取专用类型的类标签? scala>vali=(0,0) i:(Int,Int)=(0,0) scala>i.getClass res0:Class[def f[T:reflect.ClassTag](T:T)=隐式地[reflect.ClassTag[T]] f:[T](T:T)(隐式证据$1:scala.reflect.ClassTag[T])scala.reflect.ClassTag[T] scala>f(i) res1:scala.reflect.ClassTag[(Int,Int)]=scala.Tuple2,scala,Scala,隐式ClassTag参数错误。scala.Tuple2不是i的类。正确的ClassTag将用于scala.Tuple2$mcII$sp 这种行为对我们来说是个问题,因为我们用于序列化。您给readObject提供了一个Class参数。当我们从ClassTag获取它时,我们给了它一个错误的类作为专门类。然后我们读取垃圾 我是否使用了ClassTag错误?或者这是Scala 2.11.0中的一个bug?正确答案不会是Scala.Tuple2$mcII$sp。您要求的是Tuple2[Int,Int]的
ClassTag
参数错误。scala.Tuple2
不是i
的类。正确的ClassTag
将用于scala.Tuple2$mcII$sp
这种行为对我们来说是个问题,因为我们用于序列化。您给readObject
提供了一个Class
参数。当我们从ClassTag
获取它时,我们给了它一个错误的类作为专门类。然后我们读取垃圾
我是否使用了
ClassTag
错误?或者这是Scala 2.11.0中的一个bug?正确答案不会是Scala.Tuple2$mcII$sp
。您要求的是Tuple2[Int,Int]的标称(并已删除!)类型
在编译时,也就是Tuple2
。请注意getClass
是一个非常不同的东西,它可以为您提供运行时值的类。我们可以使用Kryo的writeClassAndObject
来解决这个问题,代价是每个元组1个字节。无论如何,我对答案很感兴趣。谢谢您的解释!但是我如何解决这个问题呢问题是i
的类与我为i
得到的类标签不匹配?你到底想做什么?哈哈,我想你把我弄到手了:)。
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