【问题标题】:Pattern matching Type as a parameter for functions, methods, etc模式匹配类型作为函数、方法等的参数
【发布时间】:2012-07-04 23:23:01
【问题描述】:

在我尝试创建一个动态函数来匹配“实例”之前,我在 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)   // 

  }

}

--- 更新 所以只是为了澄清(并感谢您的回答)但是有人如何在运行时动态地完成类类型的模式匹配呢?似乎 scala 有一个静态类型匹配(在上面的例子中是要分解的),但是 instanceOf( ) 是我选择的动态检查吗?

【问题讨论】:

  • 提示:当编译器告诉你有问题时,请注意它。
  • 查看this post的编辑部分。 (这是我这周第三次发这个帖子了。)

标签: scala


【解决方案1】:

类型参数在运行时被删除,所以TYPE 等效于Object,这意味着任何东西。

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

type save = TYPE

但是,它也被删除了,所以它没有保存任何东西。

【讨论】:

  • 谢谢,您是否知道使用 java.class .. 或 Scala 是否有自己的“类”对象类型?
  • @LaloInDublin 这发生在编译时,所以类文件不是什么大问题。但是,Scala 将类型信息作为常量存储在类文件中,以允许单独编译。您可以使用 javap 查看它,尽管它是二进制编码的,因此难以辨认。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2014-07-01
    • 2019-06-28
    • 1970-01-01
    相关资源
    最近更新 更多