scala.Some无法强制转换为java.lang.String

时间:2013-07-12 17:22:14

标签: scala casting scalatra

在这个应用程序中,我收到了这个错误:

scala.Some cannot be cast to java.lang.String

尝试时:

x.email.asInstanceOf[String]

x.email是一个Option [String]

编辑:我知道我在这里处理不同的类型,我只是想知道是否有一种更简洁的方式来做什么,然后一个

match { case....}

序列。因为我将x.email转换为String用于JSON目的,所以JSON对象将处理一个空字段,我没有明确地处理它。很抱歉不清楚!!

4 个答案:

答案 0 :(得分:9)

嗯,从x.email不是String的错误和类型中可以清楚地看到...

首先,决定如何处理NoneOption[String]类型的有效选项)。然后,您有许多选项,包括但不限于:

x.email match {
case None => ...
case Some(value) => println(value) // value is of type String
}

或者,请查看get上的getOrElseclass 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
}