Scala - Option.getOrElse()"类型擦除"?

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

您正尝试isOkMyClassBoolean(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)

  • 我认为`map(_.isOk)`方法就是noncom实际上要做的. (4认同)

Tom*_*icz 8

按设计工作.这个表达式:

myVal.getOrElse(false)
Run Code Online (Sandbox Code Playgroud)

返回unwrapped MyClass实例或(如果Option实际上None) - false.唯一的普通型MyClassBoolean是... 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)


Joh*_*son 6

您正在使用Boolean在Option [MyClass]中应用getOrElse,因此,它们的公共超类是Any.

你应该模式匹配:

val check = myVal match {
  case Some(c) => c.isOk
  case None => false
} 
Run Code Online (Sandbox Code Playgroud)