Применяются ли запечатанные классы в Java и, если да, то как?

можно определить sealed классы в Scala, которые в основном final за исключением случаев, когда подкласс происходит в том же файле.

кажется, что JVM не позволяет final байт-код класса и подклассы его.

учитывая, что в байт-коде нет" понятия " исходного файла, как применяется это ограничение?

, как javac предотвратить Scala sealed класс из подкласса в Java?

2 ответов


ограничение применяется для источника Scala с помощью scalac во время компиляции. Результирующие определения двоичных классов не имеют конечного флага JVMs, поэтому, как вы, вероятно, уже догадались, запечатанное ограничение не будет применяться javac, когда источники Java компилируются против двоичных файлов Scala.


Как насчет использования частного конструктора для класса, который вы хотите запечатать, а затем создать общедоступные конечные статические внутренние классы, которые расширяют этот класс. Затем вы получаете фиксированный набор подклассов во время компиляции, что не может быть продлен. Базовый класс с частным конструктором впоследствии служит путем для достижения этих внутренних классов, но сам по себе невозможен для расширения и реализации в другом месте.