2012-11-01 16 views
18

Dlaczego ten kod powoduje błąd niedopasowania typu w Scala 2.9.2? Spodziewałem się, że getOrElse powraca wpisać String ale faktycznie zwraca ona java.io.Serializable:Opcja błędu niezgodności typu getOrElse

scala> implicit def StringToOption(s:String) = Option(s) 
StringToOption: (s: String)Option[String] 

scala> "a".getOrElse("") 
res0: String = a 

scala> var opt:Option[String] = "a".getOrElse("") 
<console>:8: error: type mismatch; 
found : java.io.Serializable 
required: Option[String] 
     var opt:Option[String] = "a".getOrElse("") 
              ^

Jest OK:

scala> implicit def StringToOption(s:String): Option[String] = Option(s) 
StringToOption: (s: String)Option[String] 

scala> var b:Option[String] = "a".getOrElse("") toString 
b: Option[String] = Some(a) 
+0

> sschaef Dzięki naprawić mój angielski! – sndyuk

Odpowiedz

29

To niechciany przypadku niekompletnych przechodzenie drzewa. Podpis getOrElse umożliwia poszerzenie typu, więc gdy zda sobie on sprawę, że String nie jest Option[String], najpierw próbuje wypełnić inny typ zapisu na getOrElse, tj. Serializable. Ale teraz ma on "a".getOrElse[Serializable]("") i utknął - nie zdaje sobie sprawy, jak sądzę, problem polegał na tym, że typ był zbyt ogólny, aby sprawdzić implicity.

Kiedy zdajesz sobie sprawę z problemu, istnieje dylemat:

"a".getOrElse[String]("") 

Teraz typer nie wędrować w dół przejdźmy-poszerzyć drogę i odnajduje ukryte.

Powiązane problemy