当我尝试将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
类型为Double
或Int
,则匹配正确的大小写,但类型String
或Option[_]
大小写匹配(的println( “无”))。
任何想法为什么这不起作用或我做错了什么?提前谢谢!
编辑:如果我这样做,它可以正常工作typecast("foo")
或typecast(Some("foo"))
,但就我而言,收到的cls
值如下:
val cls: Any = classOf[User].getDeclaredField("name")
字段可以是String
或Option[String]
答案 0 :(得分:3)
关于您的更新问题:代码可以正常工作。
classOf[User].getDeclaredField
不返回String
或其他任何内容,它会返回java.lang.reflect.Field
。这是case _
正确处理的问题。您可以通过调用getType或getGenericType来获取类型java.lang.class
或java lang.reflect.Type
的值。
但是,即使这样,您的例程也不会期望Class
类型的值,它会期望类型为String
或Int
或Double
的普通值......“ 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}}对象。