2015-06-24 37 views
1

我有Scala類的等形式的列表:得到classOf [數組[A]]從classOf [A]

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; 

任何線索?謝謝。

回答

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 
+0

它的作品!涼! – Ambling

相關問題