当我尝试将 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("nothing")) .
任何想法为什么这不起作用或我做错了什么?提前致谢!
EDIT: 它工作正常,如果我这样做,例如 typecast("foo")
或 typecast(Some("foo"))
,但在我的情况下收到的 cls
值如下:
val cls: Any = classOf[User].getDeclaredField("name")
该字段可以是 String
或 Option[String]
1 回答
关于您的更新问题:代码按预期工作 .
classOf[User].getDeclaredField
不返回String
或其他任何内容,它返回java.lang.reflect.Field
. 这是case _
正确处理的 . 您可以通过调用getType或getGenericType来获取java.lang.class
或java lang.reflect.Type
类型的值 .但是,即便如此,您的例程也不期望
Class
类型的值,它期望类型String
或Int
或Double
... "cls"的普通值在那里听起来不是一个好的参数名称 .一个例行的期望类看起来像
也要小心一个字段可能被声明为类
Option
,但是没有类Option
的直接实例是抽象的,只有Some
和None
对象的实例 .