Scala:Option.getOrElse(…)的默认返回类型

Scala:Option.getOrElse(…)的默认返回类型,scala,types,Scala,Types,Scala类的函数getOrElse(…)的签名是 如果我用这个例子 val o1 = Option("Hi") val o2: Option[String] = Option(null) println(o1.getOrElse(() => "Else")) println(o2.getOrElse(() => "Else")) 我得到输出 Hi <function0> 我如何评估结果,为什么不自动评估 是默认值:⇒ B与默认值相同:()⇒ B?考虑一下: val

Scala类的函数
getOrElse(…)
的签名是

如果我用这个例子

val o1 = Option("Hi")
val o2: Option[String] = Option(null)

println(o1.getOrElse(() => "Else"))
println(o2.getOrElse(() => "Else"))
我得到输出

Hi
<function0>
我如何评估结果,为什么不自动评估

默认值:⇒ B
默认值相同:()⇒ B

考虑一下:

vale:Function0[String]=()=>“Else”
然后你可以写:

println(o1.getOrElse(e))//Hi
println(o2.getOrElse(e))//
println(o2.getOrElse(e())//Else
println(o2.getOrElse((()=>“Else”)())//Else
  • 默认情况下:⇒ B与默认值相同:()⇒ B
不,第一个叫名字,第二个叫恶作剧。按名称调用参数的类型是参数本身的类型,其中thunk的类型是
()=>T
,与
Function0[T]
相同

当您使用
o1.getOrElse(()=>“Else”)
时,您使用的是异构类型,因此Scala会找到最不常见的超类型,在本例中是
Any

val orElse: Any = o1.getOrElse(() => "Else") 
o2.getOrElse(() => "Else")()

error: Object does not take parameters
   o2.getOrElse( () => "Else")()
                              ^
val orElse: Any = o1.getOrElse(() => "Else")