1

我是使用 scala 的新手。我正在尝试将模式匹配与反射一起使用:

abstract class Person{
val name:String,
val age:Int
}
case class Man (name:String,age:Int,workPlace:String) extends Person

val aclass = Class.forName("man")
aclass match{
 case m:Man => println("this is a man class")
 case p:Person => println("Person")
 case _ => println("Nothing")
}

我总是进入默认部分(“Nothing”)和正确的匹配(Man)。我究竟做错了什么 ?

谢谢

4

2 回答 2

8

首先,您需要使用完整且大小写正确的类名。其次,Class.forName返回一个Class[_],而不是你给它的类的实例。看看我对您的代码所做的修改以获得更清晰的图片:

  abstract class Person {
    val name: String //removed comma
    val age: Int
  }

  case class Man(name: String, age: Int, workPlace: String) extends Person

  val manClassName = classOf[Man].getName //get the proper name of the class

  println("Man class name: %s".format(manClassName))

  val aclass = Class.forName(manClassName) //returns Class[Man]

  aclass match {
    case m: Class[Man] => println("this is a man class") //Pattern match on Class[Man]
    case p: Class[Person] => println("Person")
    case _ => println("Nothing")
  }
于 2013-06-25T17:19:50.920 回答
-1

您的代码几乎没有问题。也许我不明白你在用 Class.forName(String) 做什么,所以我做了一些改变。

首先,为这些用例类,以便您获得用于封装的 getter 和 setter。

sealed trait Person
case class Man (name:String,age:Int,workPlace:String) extends Person

接下来,Class.forName 返回一个类,而不是一个对象。所以你需要通过调用 Man 的 Constructor 来实例化

val man = Man("Jo", 24, "anywhere")

然后您可以对其进行模式匹配:

man match{
 case m:Man => println("this is a man class")
 case p:Person => println("Person")
 case _ => println("Nothing")
}

它将匹配第一个命中的案例,因此请确保您按照自己的意愿订购人和个人案例。对于反射,您需要查看 TypeTags 和 ClassTags

http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html

于 2013-06-25T17:54:14.327 回答