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

Arrays 从classOf[A]获取classOf[Array[A]],arrays,scala,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来注册类和类的数组 但是,我无法从class

我有一个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仍然抱怨类未注册:A[]

scala> getArrayClass(classOf[A])
res0: Class[Array[A]] = class java.lang.Object

scala> classOf[Array[A]]
res1: Class[Array[A]] = class [LA;
有什么线索吗?谢谢。

您可以使用方法
ClassTag

def getArrayClass(c: Class[_]): Class[_] =
  scala.reflect.ClassTag(c).wrap.runtimeClass
请注意,如果
c
classOf[Null]
classOf[Nothing]
(我相信这是ClassTags中的bug),则这不起作用。对于任何其他
,它都可以工作

您也可以使用Java方式,而不使用
ClassTag
s,这基本上是等效的:

def getArrayClass(c: Class[_]): Class[_] =
  java.lang.reflect.Array.newInstance(c, 0).getClass
您可以使用方法
ClassTag

def getArrayClass(c: Class[_]): Class[_] =
  scala.reflect.ClassTag(c).wrap.runtimeClass
请注意,如果
c
classOf[Null]
classOf[Nothing]
(我相信这是ClassTags中的bug),则这不起作用。对于任何其他
,它都可以工作

您也可以使用Java方式,而不使用
ClassTag
s,这基本上是等效的:

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