从classOf [A]获取classOf [Array [A]]

时间:2015-06-24 09:56:16

标签: arrays scala

我有一个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;

任何线索?感谢。

1 个答案:

答案 0 :(得分:3)

您可以使用wrap方法ClassTag

来执行此操作
def getArrayClass(c: Class[_]): Class[_] =
  scala.reflect.ClassTag(c).wrap.runtimeClass

请注意,如果cclassOf[Null]classOf[Nothing](我认为这是ClassTags中的错误),则无效。对于任何其他Class,它都可以。

你也可以去Java的方式,没有ClassTag s,这基本上是等价的:

def getArrayClass(c: Class[_]): Class[_] =
  java.lang.reflect.Array.newInstance(c, 0).getClass