Являются ли закрытые классы принудительными в Java и, если да, как?

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

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

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

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

2 ответа

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


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

licensed under cc by-sa 3.0 with attribution.