我有一个scala类列表,如:
List(classOf[A], classOf[B], ...)
我需要将这些类以及类的数组注册到kryo中。结果如下:
kryo.register(classOf[A])
kryo.register(classOf[Array[A]])
kryo.register(classOf[B])
kryo.register(classOf[Array[B]])
...
因此,有了手头的列表,我可能只使用foreach来注册类和类的数组。
但是,我无法从classOf [A]获得classOf [Array [A]]。我已经尝试过ClassTag以下方法:
def getArrayClass[T: ClassTag](c: Class[T]): Class[_] = {
classOf[Array[T]]
}
结果不正确(尽管两种结果的类型相同),并且kryo仍然抱怨Class没有注册:A []。
scala> getArrayClass(classOf[A])
res0: Class[Array[A]] = class java.lang.Object
scala> classOf[Array[A]]
res1: Class[Array[A]] = class [LA;
任何线索?感谢。
答案 0 :(得分:3)
您可以使用wrap
方法ClassTag
:
def getArrayClass(c: Class[_]): Class[_] =
scala.reflect.ClassTag(c).wrap.runtimeClass
请注意,如果c
为classOf[Null]
或classOf[Nothing]
(我认为这是ClassTags中的错误),则无效。对于任何其他Class
,它都可以。
你也可以去Java的方式,没有ClassTag
s,这基本上是等价的:
def getArrayClass(c: Class[_]): Class[_] =
java.lang.reflect.Array.newInstance(c, 0).getClass