non*_*com 4 scala type-erasure option
我正在尝试使用该Option.getOrElse()方法,但它返回etiher Any或者ScalaObject而不是正确Option参数化的类的实例.我找不到任何关于这个问题的提及,它似乎不应该存在.我究竟做错了什么?
class MyClass {
def isOk = true
}
val myVal = Some(new MyClass) // :Option[MyClass]
val check = myVal.getOrElse(false).isOk
Run Code Online (Sandbox Code Playgroud)
无法调用该isOk方法,因为它尝试调用它Any.
sen*_*nia 17
您正尝试isOk在MyClass和Boolean(Any)的基类上调用方法.
试试这个:
scala> class MyClass(b: Boolean) { def isOk = b }
defined class MyClass
scala> val myVal = Some(new MyClass(true))
myVal: Some[MyClass] = Some(MyClass@35d56bbe)
scala> myVal.map{_.isOk}.getOrElse(false)
res0: Boolean = true
scala> myVal.getOrElse(new MyClass(false)).isOk
res1: Boolean = true
Run Code Online (Sandbox Code Playgroud)
按设计工作.这个表达式:
myVal.getOrElse(false)
Run Code Online (Sandbox Code Playgroud)
返回unwrapped MyClass实例或(如果Option实际上None) - false.唯一的普通型MyClass和Boolean是... Any.这就是你所看到的.
为了使这个工作,你必须返回兼容一些与MyClass来自getOrElse():
myVal.getOrElse(new MyClass).isOk
Run Code Online (Sandbox Code Playgroud)
或者您可能想要实现null-object模式:
object MyClass {
val Empty = new MyClass
}
myVal.getOrElse(MyClass.Empty).isOk
Run Code Online (Sandbox Code Playgroud)
您正在使用Boolean在Option [MyClass]中应用getOrElse,因此,它们的公共超类是Any.
你应该模式匹配:
val check = myVal match {
case Some(c) => c.isOk
case None => false
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7889 次 |
| 最近记录: |