在这个应用程序中,我收到了这个错误:
scala.Some cannot be cast to java.lang.String
尝试时:
x.email.asInstanceOf[String]
x.email是一个Option [String]
编辑:我知道我在这里处理不同的类型,我只是想知道是否有一种更简洁的方式来做什么,然后一个
match { case....}
序列。因为我将x.email转换为String用于JSON目的,所以JSON对象将处理一个空字段,我没有明确地处理它。很抱歉不清楚!!
答案 0 :(得分:9)
嗯,从x.email
不是String
的错误和类型中可以清楚地看到...
首先,决定如何处理None
(Option[String]
类型的有效选项)。然后,您有许多选项,包括但不限于:
x.email match {
case None => ...
case Some(value) => println(value) // value is of type String
}
或者,请查看get
上的getOrElse
和class Option
方法。
如果要“降级”具有可能null
值的字符串的选项,请使用
x.email.orNull // calls getOrElse(null)
最后,如果您只是不关心None
案例(并且想要忽略它),那么只需使用一个简单的“for comprehension”,它将“跳过”{{1}中的正文。 case:
None
答案 1 :(得分:4)
在选项方面,投射不是您应该如何看待转化。看看下面的REPL会话:
C:\>scala -deprecation -unchecked
Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0).
Type in expressions to have them evaluated. Type :help for more information.
scala> val email:Option[String] = Some("x@y.com")
email: Option[String] = Some(x@y.com)
scala> email.getOrElse("defaults@example.com")
res0: String = x@y.com
scala>
您可能还想查看此SO问题:What is the point of the class Option[T]?
和选项API here
一般来说,施法/强制是FP世界中的一种禁忌。 :)
答案 2 :(得分:2)
x.map(_.toString).getOrElse("")
答案 3 :(得分:1)
您可能需要使用模式匹配:
x.email match {
case Some(email) => // do something with email
case None => // did not get the email, deal with it
}