【问题标题】:Scala case matching Any with StringScala 大小写匹配 Any 和 String
【发布时间】:2013-07-14 22:14:29
【问题描述】:

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

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

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

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

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

字段可以是StringOption[String]

【问题讨论】:

  • 对我来说就像一个魅力,typecast("foo") 打印“string”,typecast(None) 和 typecast(Some("stuff")) 打印“option”。
  • 刚刚认识到,这只是在我的特殊情况下发生。我编辑了这个问题。感谢您的提示。

标签: scala


【解决方案1】:

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

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 对象的实例。

【讨论】:

  • 感谢您的回答!当然,我必须调用 getType()。它在函数需要 Class[_] 时工作
猜你喜欢
  • 2015-12-03
  • 2013-12-07
  • 2016-07-03
  • 2018-09-23
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
相关资源
最近更新 更多