我使用scala 2.11.2。这是我的一部分功能:
import scala.reflect.runtime.universe._
p => p.filter(p => typeOf[p.type] != typeOf[Nothing]).flatMap {
case Some(profile) => {
...
env.userService.save(profile.copy(passwordInfo = Some(hashed)),...) //<---------error here
}
case _ => ...
}
编译错误是:
PasswordReset.scala:120: value copy is not a member of Nothing
[error] env.userService.save(profile.copy(passwordI
nfo = Some(hashed)), SaveMode.PasswordChange);
[error] ^
我想我使用滤波器相位过滤Nothing类型,但为什么它仍然给我type Nothing错误。我不想:
profile.getDefault().copy(...)
因为我真的需要复制profile而不是复制默认值,如果profile是Nothing就删除它。怎么做呢?
过滤器不改变类型
scala> def f[A](x: Option[A]) = x filter (_ != null)
f: [A](x: Option[A])Option[A]
Option[A]
进来,Option[A]
出去。
你是在建议过滤器函数中的运行时检查应该指示编译器接受你的类型参数不是Nothing,但它不是这样工作的。
scala> f(None)
res2: Option[Nothing] = None
如果Nothing被推断,那么Nothing就是你得到的。
你想要避免编译器在某处推断出Nothing。有时需要提供显式的类型参数:
scala> f[String](None)
res3: Option[String] = None
scala> f[String](None) map (_.length)
res4: Option[Int] = None
与
scala> f(None) map (_.length)
<console>:9: error: value length is not a member of Nothing
f(None) map (_.length)
^
但是你也可以用不同的方式来表达你的代码