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

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

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

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

Поэтому как можно javac предотвратить скала sealed класс из субкласса в Java?

2 ответа

Решение

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

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

Другие вопросы по тегам