2016-10-04 7 views
1

特殊クラスのClassオブジェクトを取得する必要があります。例えばScala - 特殊クラスのクラスを取得

import breeze.linalg.DenseVector 

val compileTimeClass = classOf[DenseVector[Double]] 
println(compileTimeClass) 

val denseVector = DenseVector(0.5, 1.0, 1.0, 0.5) 
println(denseVector.getClass) 

出力は次のとおりです。

class breeze.linalg.DenseVector 
class breeze.linalg.DenseVector$mcD$sp 

私はそれを正しく理解していれば、Scalaは、実行時にDenseVectorの専門のバージョンを作成していますか? Kryoとのシリアライズのためにこれらの専門クラスの1つを登録する必要があるので、これは私の問題です。

DenseVectorの特殊なインスタンスでgetClassを呼び出す以外に、特別な型のClassオブジェクトを取得する方法はありませんか?

+0

'DenseVector'を修正できますか? – talex

+0

DenseVectorは、Spark MLで使用されるBreezeライブラリにあります。私はそれもmyslefを構築していない、ML APIは私のためにそれを行います。 –

+0

さて、 'DenseVector'に' kryo'を登録するだけでいいと思います。 'A 'が' kryo'にも登録されている限り、 'DenseVector [A]'を扱うことができるはずです。 –

答えて

0

これは、すべての型パラメータクラスで発生します。例えば

scala> classOf[List[Int]] 
res8: Class[List[Int]] = class scala.collection.immutable.List 

scala> val l = List[Int](1, 2, 3, 4) 
l: List[Int] = List(1, 2, 3, 4) 

scala> l.getClass 
res9: Class[_ <: List[Int]] = class scala.collection.immutable.$colon$colon 

Listは今、戻ってあなたの質問に来て、私はあなただけkryoDenseVectorを登録する必要があると思います。

そのkryoは限りそのAkryo.

+0

問題はジェネリックでタイプ消去ではありません - それも起こっていますが、kryoは処理できます。それは特別なクラスです。 http://www.scala-notes.org/2011/04/specializing-for-primitive-types/ –

+0

私はここでヒントを得ようとしているのは、あなたが 'List' 。 –

+0

kryo.register(classOf [breeze.linalg.DenseVector [_]]) コンパイル時に知られている型消去されたDenseVectorを登録しているので、不幸にもうまくいきません。実行時に特殊なクラスを登録していないので、明らかにKryoがスローされます。私はタプルも特殊化されており、twitter.chillのScalaTupleSerializationによって処理されていることに気付きました。 –

1

に登録されているようにもかかわらず、ことが判明し、任意のDenseVector[A]に対処することができるはずです後:で、コンパイル時にエラーとして

kryo.register(classOf[breeze.linalg.DenseVector$mcD$sp]) 

ショーIntelliJ、それは実際にコンパイルし、期待どおりに動作します。つまり、使用してシリアライズするすべての特殊化を明示的に登録する必要があります。 Twitter Chillライブラリは、登録とシリアライゼーションコードを自動生成してTuple *クラスのためにこれを丸めます。https://github.com/twitter/chill/blob/develop/scripts/tuple_serializers.scala

関連する問題