8

在此应用程序中,我收到此错误:

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

尝试此操作时:

x.email.asInstanceOf[String]

x.email 是一个选项[字符串]

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

match { case....}

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

4

4 回答 4

10

好吧,从错误和类型中您可以清楚地知道x.email不是String...

首先,决定你想如何处理None(类型的有效选项Option[String])。然后,您有多种选择,包括但不限于:

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

或者,查看 上的getgetOrElse方法class Option

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

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

最后,如果您只是不关心这个None案例(并且想忽略它),那么只需使用一个简单的“理解”,它将“跳过”None案例中的主体:

for (value <- x.email) {
  // value is of type String
}
于 2013-07-12T17:31:05.210 回答
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 问题:Option[T] 类有什么意义?

和此处的选项 API

一般来说,铸造/强制是FP世界的一种禁忌。:)

于 2013-07-12T17:34:20.803 回答
3
x.map(_.toString).getOrElse("")
于 2013-07-31T01:32:35.467 回答
1

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

x.email match {
  case Some(email) => // do something with email
  case None => // did not get the email, deal with it
}
于 2013-07-12T17:30:56.380 回答