Scala 有些不能转换为java.lang.String

Scala 有些不能转换为java.lang.String,scala,casting,scalatra,Scala,Casting,Scalatra,在此应用程序中,我遇到以下错误: scala.Some cannot be cast to java.lang.String 尝试此操作时: x.email.asInstanceOf[String] x、 电子邮件是一个选项[字符串] 编辑:我知道我在这里处理的是不同的类型,我只是想知道是否有一种更简洁的方法可以不使用None-then-a match { case....} 顺序。因为我将x.email转换成一个字符串用于JSON,所以JSON对象将处理一个空字段,我不必显式地处理它。对

在此应用程序中,我遇到以下错误:

scala.Some cannot be cast to java.lang.String
尝试此操作时:

x.email.asInstanceOf[String]
x、 电子邮件是一个选项[字符串]

编辑:我知道我在这里处理的是不同的类型,我只是想知道是否有一种更简洁的方法可以不使用None-then-a

match { case....}

顺序。因为我将x.email转换成一个字符串用于JSON,所以JSON对象将处理一个空字段,我不必显式地处理它。对不起,不清楚

您可能需要使用模式匹配:

x.email match {
  case Some(email) => // do something with email
  case None => // did not get the email, deal with it
}

从错误和类型中可以清楚地看出,
x.email
不是
字符串

首先,决定如何处理
None
(对于类型为
option[String]
的内容是有效的选项)。然后,您有许多选择,包括但不限于:

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

或者,查看
class选项上的
get
getOrElse
方法

如果要将该选项“降级”为具有可能的
null
值的字符串,请使用

x.email.orNull // calls getOrElse(null)

最后,如果您只是不关心
None
案例(并且想忽略它),那么只需使用一个简单的“for consusibility”,它将在
None
案例中“跳过”正文:

for (value <- x.email) {
  // value is of type String
}

for(valueCasting不是您在选项方面应该考虑的转换方式。请查看以下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>
您可能还想看看这个问题:

以及选项API


一般来说,施放/强制是FP世界中的一种禁忌。

您可能会使用
orNull
而不是
getOrElse(null)
orNull
并不总是有效。我只是尝试了
java.lang.Integer
而不是
java.lang.String
,然后编译
orNull
失败,因为
无法证明空的简单答案是使用
foreach
方法。
x.map(_.toString).getOrElse("")