为什么我们可以在java中创建从sealed(scala)派生的新类?
考虑两个类别A和B: //斯卡拉 对象A{ 密封抽象类Nat case对象零扩展Nat 案例类成功:Nat扩展Nat def ppn:Nat=n匹配{ 案例零=>printlnZero 案例成功=>printlnsuch 案例=>printlnWTF } def mainargs:数组[字符串]= ppB.f } //B.java 公共B级{ 静态A.natf{ 返回新的A.Nat{}; } } 编译、运行:为什么我们可以在java中创建从sealed(scala)派生的新类?,java,scala,sealed,Java,Scala,Sealed,考虑两个类别A和B: //斯卡拉 对象A{ 密封抽象类Nat case对象零扩展Nat 案例类成功:Nat扩展Nat def ppn:Nat=n匹配{ 案例零=>printlnZero 案例成功=>printlnsuch 案例=>printlnWTF } def mainargs:数组[字符串]= ppB.f } //B.java 公共B级{ 静态A.natf{ 返回新的A.Nat{}; } } 编译、运行: $ scala A WTF 如中所述,密封类不能直接继承,除非继承模板与继承类在同一
$ scala A
WTF
如中所述,密封类不能直接继承,除非继承模板与继承类在同一源文件中定义
我认为这意味着通过在同一个文件中定义的子类进行模式匹配足以覆盖所有情况,但正如我们从这个示例中看到的,这不是真的
这里有一个问题:有没有一种方法可以编写真正密封的类,比如或者我需要在每个模式匹配中编写虚拟的最后一个case来确保代码安全?可以从Java创建它们,因为Scala类被密封的细节只有Scala编译器自己才能遵守。Java编译器根本不知道A.Nat是密封的
另外,您需要将suc标记为sealed,否则即使在Scala中也有人可以对其进行扩展。可以从Java创建它们,因为Scala类被密封的细节只有Scala编译器自己才能遵守。Java编译器根本不知道A.Nat是密封的 另外,您需要将suc标记为sealed,否则即使在Scala中也有人可以扩展它