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など) を書く方法はありますか?それとも、コードの安全性を確保するために、すべてのパターン マッチでダミーの最後のケースを書く必要がありますか?