4

このコードが型チェックを行わないのはなぜですか?

def foo: Either[String, List[Int]] = {  
  val x = null: Either[String, String]

  x match {
    case l @ Left(_) => l
    case Right(_) => Right(List(3))
  }
}

具体的には、なぜコンパイラは Left[A,X] と Each[A,B] の型を具体化できない/しないのでしょうか?

これはscala 2.8.2およびscala 2.9.2で発生しました

4

1 に答える 1

9

ここには真の対立があります。

Left[String, String] <: Either[String, List[Int]]

真実ではない。 は左右の両方のパラメーターLeftで入力され、2 つの間に実際の違いはありませんが(したがって、キャストは安全です)、これはコンパイラーに伝えたものではありません。したがって、当然、文句を言うでしょう。

パターン マッチングの型推論には他にも弱点がありますが、これはその 1 つではありません。


編集:代替の単一パラメータ化された実装を想像できLeftます

Left[String] <: Either[String, Nothing] <: Either[String, List[Int]]

型情報を破棄します。のようなメソッドswapを使用するのはトリッキーですが、OP によって指定されたパターンが許可されます。ただし、Scala の標準実装では型保持形式が使用されていました。

于 2012-08-07T15:08:51.170 に答える