首页 文章

Scala案例匹配Any与String

提问于
浏览
1

当我尝试将 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("nothing")) .

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

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

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

该字段可以是 StringOption[String]

1 回答

  • 2

    关于您的更新问题:代码按预期工作 .

    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 的直接实例是抽象的,只有 SomeNone 对象的实例 .

相关问题