问题描述
如果我声明以下密封层次结构
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 和此部分:
由 permit 指定的类必须位于超类附近: 在同一个模块中(如果超类在命名模块中)或 在同一个包中(如果超类在未命名的模块中)。
但是,Maven 在编译时不应该默认使用类路径吗?完全可以避免这种限制吗?
如果不是,这不是开创了一个先例,其中模块路径上的功能比类路径上的功能更灵活,反过来-虽然仍然支持类路径,但相比之下,它不像以前那样是一等公民到模块路径?
解决方法
类路径是未命名的模块。
动机是密封类及其(直接)子类是紧密耦合的,因为它们必须一起编译和维护。在模块化世界中,这意味着“相同的模块”;在非模块化世界中,对此的最佳近似是“相同的包”。
所以,是的,如果您使用模块,您会获得一些额外的灵活性,因为模块为您提供了安全边界。