1

2 つのクラス A と B を考えます。

// A.scala
object A {
  sealed abstract class Nat
  case object Zero extends Nat
  case class Succ(n : Nat) extends Nat

  def pp(n : Nat) = n match {
    case Zero => println("Zero")
    case Succ(m) => println("Succ")
    case _ => println("WTF")
  }

  def main(args : Array[String]) = 
    pp(B.f())
}
// B.java
public class B {
    static A.Nat f() {
        return new A.Nat() {};
    }
}

コンパイルして実行:

$ scala A
WTF

ドキュメントで述べたように、「継承するテンプレートが継承されるクラスと同じソース ファイルで定義されている場合を除き、シールされたクラスは直接継承されない場合があります。」

同じファイルで定義されたサブクラスを介したパターン マッチングは、すべてのケースをカバーするのに十分であることを暗示していると思いましたが、この例からわかるように、そうではありません。

ここに質問があります:本当に封印されたクラス ( ADTsなど) を書く方法はありますか?それとも、コードの安全性を確保するために、すべてのパターン マッチでダミーの最後のケースを書く必要がありますか?

4

1 に答える 1