Scala - 获取专门课程的Class

时间:2016-10-04 15:35:32

标签: scala kryo

我需要为专门的类获取一个Class对象。 e.g。

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进行序列化。

除了在DenseVector的专用实例上调用getClass之外,还有办法获得专门类型的Class对象吗?

2 个答案:

答案 0 :(得分:1)

原来,即使:

var product = new Product(myDto);
// product.productDto is accessible!

在IntelliJ中显示为编译时错误,它实际上编译并按预期工作。这意味着我们必须明确注册我们使用和序列化的每个特化。 Twitter chill库通过使用https://github.com/twitter/chill/blob/develop/scripts/tuple_serializers.scala

自动生成注册和序列化代码,为Tuple *类绕过这个

答案 1 :(得分:0)

嗯......每个类型参数化类都会发生这种情况。例如List

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

现在回到你的问题,我认为你只需要在DenseVector注册kryo

之后kryo应该能够处理任何DenseVector[A],只要A也注册kryo.