簡體   English   中英

為什么我們可以在java中創建從密封(scala)派生的新類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM