2010-12-16 32 views
12

可以在Scala中定义sealed类,除非子类在同一个文件中发生,否则基本上都是final在Java中是否实施了密封类,如果是,如何实现?

看来,JVM不允许final类字节码它的子类。

考虑到字节码中没有源文件的“概念”,这个限制是如何执行的?

因此,javac如何防止Scala sealed类在Java中被分类?

+0

所以,为了澄清一下,你问是否有可能在JVM上运行Scala代码中的密封类(不是**),在Java *语言中可能有类似于'密封'类)。对? – 2010-12-16 12:07:00

+0

你的意思是“看来JVM不允许最终的类字节码”?没有字节码标记类最终? – pedrofurla 2010-12-16 12:16:34

+0

@pedrofurla:AFAIK JVM不允许在字节码中标记为“final”的类的子类?或者这个限制只在'javac'中执行? – soc 2010-12-16 12:24:36

回答

15

这个限制是scalac在编译时为Scala源强制执行的。由此产生的二进制类定义没有设置JVMs最终标志,正如您现在可能已经猜到的那样,当针对Scala二进制文件编译Java源代码时,javac不会强制执行密封的限制。

+0

是否可以在Java/JVM端执行它(例如通过'sealed class'构造函数中的包检查),即使它仅在运行时? – Adowrath 2017-05-07 10:28:49

1

如何使用私人构造函数为要封闭的类,然后创建公共最终静态内部类来扩展该类。然后你在编译时得到一组固定的子类,不能进一步扩展。具有私有构造函数的基类随后用作到达这些内部类的路径,但本身不可能在其他地方扩展和实现。