无法对具有不同运行时类型的Option [String]进行模式匹配

时间:2013-11-16 04:17:54

标签: scala

我有一个服务器的响应,我需要在(REPL)上进行模式匹配:

scala> val res = getResponse
res: Option[String] = Some(Some(9a/Fv8kifYPRfQNTTpke4XZiMGCLbbB))
scala> res.getClass
res11: Class[_ <: Option[String]] = class scala.Some

但我无法获得Some(Some(x))的价值。当我说:

res.get

我收到java.lang.ClassCastException: scala.Some cannot be cast to java.lang.String

的错误

或者:

scala> res.toString
res15: String = Some(Some(9a/Fv8kifYPRfQNTTpke4XZiMGCLbbBle0Gh73p3TIA=))

我可以说:

val a = res.asInstanceOf[Option[Option[String]]]
a.get.get // or a match { ... }

但如果res = None会有异常,那会不会有什么?有更好,更优雅的方式吗?

1 个答案:

答案 0 :(得分:1)

似乎你在getResponse内的某个地方有错误的演员。结果类型为Option[String],但您确实得到Option[Option[String]]

scala> val x = Some(Some("test"))
x: Some[Some[String]] = Some(Some(test))

scala> val y = x.asInstanceOf[Option[String]]
y: Option[String] = Some(Some(test))

scala> y.get
java.lang.ClassCastException: scala.Some cannot be cast to java.lang.String

对于a.get.get,您可以a.flatten(它为您提供选项[字符串]),foreachmap

scala> x.flatten
res0: Option[String] = Some(test)

scala> res0 foreach println
test

另外,请查看Option Cheat List