2

当我尝试将 anAny与字符串匹配时,我没有得到正确的输出。我的代码如下所示:

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")
    }
}

如果clsDoubleor类型Int,则匹配正确的大小写,但匹配类型StringorOption[_]大小写 _ (println("nothing"))。

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

编辑:如果我这样做,它可以正常工作,例如typecast("foo")or typecast(Some("foo")),但在我的情况下,cls收到的值如下:

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

字段可能是 aStringOption[String]

4

1 回答 1

3

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

classOf[User].getDeclaredField不返回 aString或其他什么,它返回 a java.lang.reflect.Field。这是正确处理的case _。您可以获得 type 的值java.lang.class,或者java lang.reflect.Type通过调用 getType 或 getGenericType 。

但是,即使那样,您的例程也不期望 type 的值Class,它期望 type Stringor Intor的普通值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")
}

也要小心,一个字段可能被声明为 class Option,但没有 class 的直接实例Option是抽象的,只有SomeNoneobject 的实例。

于 2013-07-14T14:14:29.437 回答