scala Class.forName模式匹配

scala Class.forName模式匹配,scala,pattern-matching,Scala,Pattern Matching,我是使用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") c

我是使用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")
}
我总是得到默认部分(“无”)和正确匹配(人)。我做错了什么


谢谢

首先,您需要使用完整且大小写正确的类名。其次,
Class.forName
返回一个
Class[\u]
,而不是您给它的类的实例。请看一下我为更清楚地了解您的情况而对代码所做的修改:

  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")
  }

首先,您需要使用完整且大小写正确的类名。其次,
Class.forName
返回一个
Class[\u]
,而不是您给它的类的实例。请看一下我为更清楚地了解您的情况而对代码所做的修改:

  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")
  }

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

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

sealed trait Person
case class Man (name:String,age:Int,workPlace:String) extends Person
接下来,Class.forName返回一个类,而不是一个对象。 因此,您需要通过调用Man的构造函数来实例化

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")
}
它将匹配第一个成功的案例,因此确保您按照自己的意愿订购人和人的案例。 对于反射,您需要查看类型标记和类标记


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

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

sealed trait Person
case class Man (name:String,age:Int,workPlace:String) extends Person
接下来,Class.forName返回一个类,而不是一个对象。 因此,您需要通过调用Man的构造函数来实例化

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")
}
它将匹配第一个成功的案例,因此确保您按照自己的意愿订购人和人的案例。 对于反射,您需要查看类型标记和类标记


这只是一个有问题的输入错误,还是您可以在实际代码中使用
java.lang.ClassNotFoundException:man
(java类名区分大小写)?顺便说一句,你的Person类甚至不应该因为逗号而编译。这只是一个有问题的输入错误,还是你可以在实际代码中使用
java.lang.ClassNotFoundException:man
(java类名区分大小写)?顺便说一下,您的Person类甚至不应该因为逗号而编译。谢谢,这很有效!顺便说一句,类是什么?它是一个普通类吗?它只是表示类是一个类型构造函数并接受一个类型。所以在你的情况下是阶级[人]。我不小心投了高票。但我不确定这个答案有什么意义。它与发生类型擦除的类[\u]匹配。看看这有多误导人
scala>Class.forName(classOf[String].getName)match{case m:Class[Man]=>println(“这是一个Man类”)//类[Man]上的模式匹配case p:Class[Person]=>println(“Person”)case\u=>println(“Nothing”)}这是一个Man类
谢谢,这很有效!顺便说一句,类是什么?它是一个普通类吗?它只是表示类是一个类型构造函数并接受一个类型。所以在你的情况下是阶级[人]。我不小心投了高票。但我不确定这个答案有什么意义。它与发生类型擦除的类[\u]匹配。看看这有多误导人
scala>Class.forName(classOf[String].getName)match{case m:Class[Man]=>println(“这是一个Man类”)//类[Man]上的模式匹配case p:Class[Person]=>println(“Person”)case\u=>println(“Nothing”)}这是一个Man类