2016-02-16 36 views
0

我用org.reflections掃描包在我的項目,並得到擴展某些性狀,像這樣所有類的集合:
的Java Scala的類型轉換 - 反映類

val reflections = new Reflections("classpath")<br> 
val classSet = reflections.getSubTypesOf(classOf[Validation]) 

我結束了一個util.Set[Class[_ : Validation]]
如果我做classSet.toSet.map(x => x.getName -> x).toMap使用JavaConversions我收到'缺少參數類型'錯誤。

如果我做classSet.toSet.map(x => Map(x.getName -> x)).reduce(_ ++ _)我得到同樣的錯誤。
如果我將toSet更換爲toList,則會出現「類型不匹配」錯誤。

如果我做classSet.toList.map(x => (x.getName, x)).toMap,我得到以下錯誤:
Cannot prove that (String, Class[?O]) forSome { type ?O <: com.common.Validation } <:< (T,U). not enough arguments for method toMap: (implicit ev: <:<[(String, Class[?0]) forSome { type ?0 <: com.common.Validation },(T,U)])scala.collection.immutable.Map[T,U]. Unspecified value parameter ev.


我想這組轉換爲地圖類名作爲關鍵字和反射類的價值。
注意 - 當我製作如下地圖時:var classMap = Map[String, Class[_ <: Validation]](),然後通過迭代Set來將每個元素推入此地圖。我無法訪問我從Trait實施的班級方法。

回答

0

什麼在這種情況下,有助於顯式指定的類型使用toSettoMap轉換時:

import org.reflections.Reflections 
import scala.collection.JavaConversions._ 

trait Validation 

val reflections = new Reflections("classpath") 
val javaClassSet = reflections.getSubTypesOf(classOf[Validation]) 
val scalaClassSet = javaClassSet.toSet[Class[_ <: Validation]] 
scalaClassSet.map(x => x.getName -> x).toMap[String, Class[_ <: Validation]] 
+0

謝謝!奇蹟般有效。我不知道你可以用這種方式顯式指定類型。 – Killyz