如何向Scala Set添加类

时间:2017-10-30 11:50:15

标签: scala reflection

我想通过String传递一个参数并构造一组类对象,如下所示:

def getTypes(value: String) : Set[Class[Base]] = {
  var set = Set[Class[Base]]()
  var input = value.split(",")
  if(input.contains("XXX"))
    set ++ Class[xxx]
  if(input.contains("YYY"))
    set ++ Class[yyy]
  if(input.contains("ZZZ"))
    set ++ Class[zzz]
  set
}

然后循环集合并使用class.newInstance()创建实际对象以便稍后执行某些操作。有能力的代码可以编译,但是当它运行时,它会投诉

Error:(32, 16) object java.lang.Class is not a value
    set ++ Class[xxx]

有关此事的任何线索?

1 个答案:

答案 0 :(得分:2)

您的代码段中有两个问题。正如aravindKrishna指出的那样,你正试图不正确地得到Class文字。 另一个是,你正在对待你的不可变的 Set,就像你是一个可变的那样。请记住,您不能改变对象本身 - 每个操作都返回一个新操作 - 因此您应该每次都重新分配变量(并且不建议使用var s来获取功能代码),或者使用递归,或者构造整个一气呵成。

以下是如何一次性构建集合的示例:

def getTypes(value: String): Set[Class[_ <: Base]] = {
  val mapping = Map(
    "XXX", classOf[xxx],
    "YYY", classOf[yyy],
    "ZZZ", classOf[zzz])

  val input = value.split(",").toSet

  mapping.collect {
    case (k, v) if input contains k => v
  }.toSet
}

或者,从字面上翻译原始代码段,

def getTypes(value: String): Set[Class[_ <: Base]] = {
  val input = value.split(",").toSet

  Set[Class[_ <: Base]]() ++
    input.find("XXX" ==).map(_ => classOf[xxx]) ++
    input.find("YYY" ==).map(_ => classOf[yyy]) ++
    input.find("ZZZ" ==).map(_ => classOf[zzz])
}