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.