Java to Scala类型转换 - 反映类的集合

时间:2016-02-16 07:04:25

标签: java scala reflection

我使用org.reflections扫描项目中的包并获取所有扩展某个特征的类,如下所示:

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实现的类方法。

1 个答案:

答案 0 :(得分: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]]