模式匹配键入作为函数,方法等的参数

时间:2012-07-04 23:23:02

标签: scala

我在使用Scala的模式匹配(令人惊讶的顺便说一句)方面取得了很好的进展,直到我尝试使动态函数匹配“Instance of”,并且将来作为对象的一部分可能会保存[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()是我选择的动态检查吗?

2 个答案:

答案 0 :(得分:4)

类型参数在运行时被删除,因此TYPE实际上等同于Object,这意味着任何事情。

同样,类型参数是类型,而不是值,因此您无法将其分配给变量。最多,您可以这样做:

type save = TYPE

然而,这也被删除了,所以它没有保存任何东西。

答案 1 :(得分:1)

对于更强大的运行时类型检查,您可能需要查看scala.reflect.Manifest[T]。它包装了java.lang.Class[T]并添加了一些不错的方差检查操作符。

以下是一个用法示例:The EnMAS POMDP State Class