Scala案例匹配Any与String

时间:2013-07-14 13:33:39

标签: scala

当我尝试将Any与String匹配时,我得不到正确的输出。我的代码如下:

def typecast(cls: Any) {
    cls match {
        case s: String => println("string")
        case d: Double => println("double")
        case i: Int => println("int")
        case o: Option[_] => println("option")
        case _ => println("nothing")
    }
}

如果cls类型为DoubleInt,则匹配正确的大小写,但类型StringOption[_]大小写匹配(的println( “无”))。

任何想法为什么这不起作用或我做错了什么?提前谢谢!

编辑:如果我这样做,它可以正常工作typecast("foo")typecast(Some("foo")),但就我而言,收到的cls值如下:

val cls: Any = classOf[User].getDeclaredField("name")

字段可以是StringOption[String]

1 个答案:

答案 0 :(得分:3)

关于您的更新问题:代码可以正常工作。

classOf[User].getDeclaredField不返回String或其他任何内容,它会返回java.lang.reflect.Field。这是case _正确处理的问题。您可以通过调用getType或getGenericType来获取类型java.lang.classjava lang.reflect.Type的值。

但是,即使这样,您的例程也不会期望Class类型的值,它会期望类型为StringIntDouble的普通值......“ cls“听起来不像是一个好的参数名称。

期望类的例程看起来像

def typecast(cls: Class[_]) { // will work with cls: Any too
  if(cls == classOf[Int]) println("Int")
  else if(cls == classOf[String]) println("String")
  else if(cls == classOf[Option[_]]) println("Option")
  else println("Nothing")
}

也要小心一个字段可能被声明为类Option,但是没有类Option的直接实例是抽象的,只有Some的实例和{ {1}}对象。