20

Scala 2.9.2 でこのコードが型不一致エラーを発生させるのはなぜですか? 私はそれgetOrElseがタイプを返すと思ってStringいましたが、実際には次を返しますjava.io.Serializable:

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("")
                                             ^

これで結構です:

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)
4

1 に答える 1

40

これは、不完全なツリー トラバーサルの望ましくないケースです。のシグネチャはgetOrElse型の拡張を許可するため、それがそうでStringはないことに気付くと、最初に に別の型の帰属、つまりOption[String]を埋めようとします。しかし、今は行き詰まっており、暗黙のチェックを行う前に、問題が型を一般化しすぎていたことに気付いていないのだと思います。getOrElseSerializable"a".getOrElse[Serializable]("")

問題を認識したら、修正があります。

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

これで、typer は let's-widen パスをさまようことはなく、暗黙のものを見つけます。

于 2012-11-01T22:47:11.883 に答える