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.

Кроме вызова getClass в специализированном экземпляре DenseVector, нет ли способа получить объект Class специализированного типа?

2 ответа

Оказывается, что даже если:

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

Показывает как ошибку времени компиляции в IntelliJ, он фактически компилируется и работает как ожидалось. Это означает, что нам придется явно регистрировать каждую специализацию, которую мы используем, и сериализовать. Библиотека Chill Twitter обходит это для классов Tuple*, автоматически генерируя код регистрации и сериализации с помощью https://github.com/twitter/chill/blob/develop/scripts/tuple_serializers.scala

Ну... это случится с каждым параметризованным классом. например 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.

Другие вопросы по тегам