在Java中是否实施了密封类,如果是,如何实现?
问题描述:
可以在Scala中定义sealed
类,除非子类在同一个文件中发生,否则基本上都是final
。在Java中是否实施了密封类,如果是,如何实现?
看来,JVM不允许final
类字节码和它的子类。
考虑到字节码中没有源文件的“概念”,这个限制是如何执行的?
因此,javac
如何防止Scala sealed
类在Java中被分类?
答
这个限制是scalac在编译时为Scala源强制执行的。由此产生的二进制类定义没有设置JVMs最终标志,正如您现在可能已经猜到的那样,当针对Scala二进制文件编译Java源代码时,javac不会强制执行密封的限制。
+0
是否可以在Java/JVM端执行它(例如通过'sealed class'构造函数中的包检查),即使它仅在运行时? – Adowrath 2017-05-07 10:28:49
答
如何使用私人构造函数为要封闭的类,然后创建公共最终静态内部类来扩展该类。然后你在编译时得到一组固定的子类,不能进一步扩展。具有私有构造函数的基类随后用作到达这些内部类的路径,但本身不可能在其他地方扩展和实现。
所以,为了澄清一下,你问是否有可能在JVM上运行Scala代码中的密封类(不是**),在Java *语言中可能有类似于'密封'类)。对? – 2010-12-16 12:07:00
你的意思是“看来JVM不允许最终的类字节码”?没有字节码标记类最终? – pedrofurla 2010-12-16 12:16:34
@pedrofurla:AFAIK JVM不允许在字节码中标记为“final”的类的子类?或者这个限制只在'javac'中执行? – soc 2010-12-16 12:24:36