4

私は自分のコードにバグを引き起こしましたが、それは自分が好きだったはずのバグを見つけるのが難しく、将来は避けたいと思っています。Scalaコンパイラーが私のエラーについて警告してくれると思っていました(何かが足りない場合を除いて)。

私はそれを些細なケースに減らしました:

Vector.maybeGetVector match {
  case v:Vector => true
  case _ => false
}

case class Vector(x:Int, y:Int)

object Vector {
  def maybeGetVector : Option[Vector] = Some(new Vector(1,2))
}

wildcardフォールスルーの代わりに使用した唯一の理由Noneは、返されたのサブタイプにのみ一致させたいということですOption

最初のcaseステートメントに到達不能コードが含まれていることは簡単に推測できるため、コンパイラーの警告を期待していました。Option[Vector]のサブタイプにすることはできませんVector

奇妙な部分は、次のcaseステートメントを追加した場合です。

 case i:Int => false

エラーが発生し、それOption[Vector]が必要であると通知されます。

命名規則の外で、この方法でプログラマーのエラーから保護する方法はありますか?と一致することができる唯一のものOptionSome/None/nullです。明らかな何かが欠けているように感じます。

4

1 に答える 1

5

修飾子を使用して Vector クラスを定義するとfinal、予想される「パターン型は期待される型と互換性がありません」というエラーが発生します。

私には、Scala は Option[Vector] が何らかの形で Vector のサブタイプのインスタンスであると考えていると言えます。(これは私には不可能に思えますが、それが理由だと思います。) Vector を final にすることで、一見遠い可能性が排除されます。

したがって、最初の case ステートメントに到達できない場合、それは、あなたが言ったように、Vector を Option[Vector]; のサブタイプにすることができないためではありません。むしろ、Option[Vector] は Vector のサブタイプのインスタンスになれないためです。多分それはあなたが意味したものです:)

于 2012-07-07T06:49:00.980 に答える