getClass out of String并在泛型中使用

时间:2014-03-18 16:05:08

标签: scala reflection scala-2.10

因为我会从我的websocket获得String,所以我必须将String转换为实际类型。是否可以做类似的事情?:

def createThing(cls: String) = {
  List[cls.getClass]()  // or create actors or something like that
}

createThing("Int") // should produce List[Int]

createThing("Double") // should produce List[Double]

有可能实现这一目标吗?我是反思的新手,因此我找不到解决方案。

2 个答案:

答案 0 :(得分:1)

没有。静态类型不能以您希望的方式依赖于运行时数据。例如。应

createThing("Foo")
如果没有定义类Foo

无法编译?但是,如果没有这个,你可以做很多事情。如果您在单独的问题中更好地指定问题,您可能会得到答案。

答案 1 :(得分:1)

你可以解决这个问题,而不必反思。极简主义的类层次结构可以非常有效地解决问题。这是一个例子:

trait Message
case class StringList(strings: List[String]) extends Message
case class IntList(ints: List[Int]) extends Message

object Create {
  def createThing(cls: String): Option[Message] = cls match {
    case "strings" => Some(StringList(List[String]("a","b")))
    case "ints" => Some(IntList(List[Int](3,4,5)))
    case _ => None
  }
}

object Main extends App {
  val thing = Create.createThing("ints")
  thing match {
    case Some(a: StringList) => println(s"It was a StringList containing ${a.strings}")
    case Some(b: IntList) => println(s"It was an IntList containing ${b.ints}")
    case _ => println("Nothing we know about")
  }
}