Java中是否实行封闭类,如果是,如何实现?

12

在Scala中可以定义sealed类,它们基本上与final类相同,除非子类化发生在同一文件中。

似乎JVM不允许final类的字节码及其子类存在。

考虑到字节码中没有源文件的"概念",这个限制如何实现?

因此,javac如何阻止Java中的Scala sealed类被子类化?


所以,只是为了澄清一下,您是在问是否可能在 JVM 上运行的 Scala 代码中有 sealed 类(而不是是否可能在 Java 语言 中拥有类似 sealed 类的东西),对吗? - T.J. Crowder
“'似乎JVM不允许final类字节码'是什么意思?难道没有标记类为final的字节码吗?” - pedrofurla
据我所知,JVM不允许在字节码中标记为“final”的类的子类?或者这个限制只在javac中执行? - soc
@T. J. Crowder:不,我想知道sealed类的字节码是否防止它在Java代码中被子类化。 - soc
我不相信Java支持sealed。如果它可以在同一文件中被子类化,那么除非构造函数是私有的,否则它可以在任何地方被子类化。Scala必须有自己的限制。 - Peter Lawrey
2个回答

15

这个限制是由Scala编译器(scalac)在编译时强制执行的。由此产生的二进制类定义不会设置JVM的final标志,因此,当Java源代码针对Scala二进制文件进行编译时,javac不会强制执行sealed限制。


是否可以在Java/JVM端强制执行它,即使只是在运行时(例如,在“sealed class”构造函数中进行包检查)? - Adowrath

1
使用私有构造函数来封装类,然后创建公共的final static内部类,继承该类。这样,您就可以在编译时获得一组固定的子类,无法进一步扩展。私有构造函数的基类随后作为到达这些内部类的路径,但本身无法扩展和实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接