繁体   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