我想通过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]
有关此事的任何线索?
答案 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])
}