Классы Java Sealed для классов в разных пакетах

Если я объявлю следующую запечатанную иерархию

      package a;

import b.B;

public sealed interface A permits B {

}
      package b;

import a.A;

public record B() implements A {

}

без использования модулей (без module-info.java) и попробуйте скомпилировать его с помощью Maven, я получаю

      [ERROR] .../src/main/java/a/A.java:[5,35] class a.A in unnamed module cannot extend a sealed class in a different package

Я знаю https://openjdk.java.net/jeps/409 и этот раздел:

      The classes specified by permits must be located near the superclass: either in the same 
module (if the superclass is in a named module) or in the same package (if the
superclass is in the unnamed module).

но не должен ли maven по умолчанию использовать путь к классам при компиляции? Можно ли вообще избежать этого ограничения?

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

1 ответ

Путь к классам - это безымянный модуль.

Мотивация состоит в том, что закрытый класс и его (прямые) подклассы тесно связаны, поскольку они должны компилироваться и поддерживаться вместе. В модульном мире это означает «тот же модуль»; в немодульном мире лучшим приближением для этого является «тот же пакет».

Так что да, если вы используете модули, вы получаете дополнительную гибкость, потому что модули границ безопасности предоставляют вам.

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