2012-07-04 81 views
1

我一直在使用Scala的模式匹配(驚人的順便說一句),直到我試圖做一個動態函數來匹配「實例」和未來作爲一部分對象可能會在稍後保存[type]。現在我明白瞭如何使用模式匹配類模式匹配類型作爲函數,方法等的參數

情況下,X:INT => ....

,但爲什麼會出現這種(下同)似乎任何東西傳遞給它的工作嗎?更進一步,我似乎無法使用[TYPE],它是一個對象嗎?我無法打印它或val =等。我想過嘗試使用關聯的java.Class,但這看起來不正確。任何建議表示讚賞,謝謝!

class Parent 

class Child extends Parent 

object TestTypes { 

    def testRelate[TYPE](o:Any) = { 

    o match { 
     case o:TYPE => println(" o is a matching type") 
     case _ => println(" o fails") 
    } 

    // val save = [TYPE] .. why can't I do this? 
    } 

    def main(args: Array[String]): Unit = { 

    val p = new Parent 
    val c = new Child 
    testRelate[Int](c) // why does this Match??? 
    testRelate[Parent](c) // 

    } 

} 

---更新 所以我只想澄清(謝謝你的答案),但有人又如何能做到在運行時動態CLASSTYPE的模式匹配?它似乎scala有一個靜態類型匹配(這在上面的例子崩潰),但是我的動態檢查的選擇是instanceOf()嗎?

+3

提示:當編譯器告訴你的東西是不對的,要注意它。 –

+1

請參閱[本文]的編輯部分(http://stackoverflow.com/questions/11310547/how-to-distinguish-between-objects-with-different-abstract-type-fields/11311312#11311312)。 (這是我第三次發佈這個星期。) – missingfaktor

回答

4

類型參數在運行時被擦除,因此TYPE實際上等同於Object,這意味着任何事情。

此外,類型參數是類型,而不是值,因此您無法將其分配給變量。至多,你可以這樣做:

type save = TYPE 

但是,這也被刪除,所以它不保存任何東西。

+0

謝謝,你會碰巧知道這可能如何使用java.class ..或Scala是否有它自己的「類」對象類型? – LaloInDublin

+0

@LaloInDublin這發生在編譯時,所以類文件不是很關心。但是,Scala將類型信息作爲常量存儲在類文件中,以允許單獨編譯。你可以用'javap'來查看它,儘管它是二進制編碼的,因此難以辨認。 –

1

如需更強大的運行時類型檢查,您可能需要查看scala.reflect.Manifest[T]。它包裝了一個java.lang.Class[T]並添加了一些不錯的差異檢查運算符。

下面是一個使用示例:The EnMAS POMDP State Class