2013-06-25 159 views
0

我是使用scala的新手。 我試圖使用模式與反射匹配:scala Class.forName模式匹配

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

我總是得到默認的一部分(「無」),並以正確的匹配(MAN)。我究竟做錯了什麼 ?

謝謝

+1

難道只是問題一個錯字或你沒事用'拋出java.lang.ClassNotFoundException:在您的實際代碼man'(Java類名稱區分大小寫)?順便說一句,你的Person類甚至不應該因逗號而編譯。 –

回答

5

首先,您需要使用完整和適當的類名稱。其次,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") 
    } 
+0

謝謝,這工作!順便說一句,[class]是什麼? – igx

+0

這只是一種表示Class是類型構造函數並且需要一個類型的方法。所以你的情況是Class [Man]。 – Noah

0

代碼很少出現問題。也許我不明白你在用Class.forName(String)做什麼,所以我改變了一些東西。

首先,這些的用例類,以便讓你的getter和setter進行封裝。

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

接下來,Class.forName返回一個Class,而不是一個對象。 所以,你需要通過調用人

的構造
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") 
} 

它會擊中第一種情況相符,但這樣必須確保所訂購的人,個人情況如何你想要他們。 對於反射,你會想看看類型標籤和ClassTags

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