[英]Why can we create new classes derived from sealed(scala) in java?
考慮兩個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
如文檔中所述,“密封類可能不會直接繼承,除非繼承模板在與繼承類相同的源文件中定義。”
我認為這意味着通過同一文件中定義的子類進行模式匹配足以涵蓋所有情況,但正如我們從這個例子中看到的那樣,它不是真的。
這是一個問題:有沒有辦法編寫真正密封的類(如ADT )或者我需要在每個模式匹配中編寫虛假的最后一個案例以確保代碼安全?
可以從Java創建它們,因為Scala類密封的細節僅受Scala編譯器本身的尊重。 Java編譯器沒有A.Nat完全密封的概念。
另外作為旁注,你需要將Succ標記為密封,否則即使在Scala中有人可以擴展它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.