2014-06-27 42 views
1
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如何獲得專門類型的ClassTag?

這種行爲對我們來說是一個問題,因爲我們使用Kryo進行序列化。你給Class參數readObject。正如我們從ClassTag中得出的那樣,我們給它的專門課程錯了。然後我們讀垃圾。

我使用ClassTag錯了嗎?或者這是Scala 2.11.0中的一個錯誤?

+0

我們可以使用KRYO的'writeClassAndObject'解決此在每個元組的1個字節的成本。無論如何,我對這個答案很感興趣。 –

回答

1

正確答案不是scala.Tuple2$mcII$sp。您所要求的在編譯時的名義(和刪除!)型Tuple2[Int, Int],這是Tuple2。請注意,getClass是一個非常不同的事物,它會讓您獲得運行時值的類別。

+0

感謝您的解釋!但是,如何解決'i'類與我爲'i'獲得的ClassTag不匹配的問題? –

+0

你到底想做什麼? –

+0

哈哈,我想你讓我在那裏:)。 –