不同包中类的密封类

如果我声明以下密封层次结构

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 在编译时不应该默认使用类路径吗?能否完全避免这种限制?

如果不是,这不是开创了一个先例,其中模块路径上的功能比类路径上的功能更灵活,反过来 - 虽然仍然支持类路径,但与模块路径相比,它不像以前那样是一等公民?

回答

类路径未命名的模块。

动机是密封类及其(直接)子类是紧密耦合的,因为它们必须一起编译和维护。在模块化世界中,这意味着“相同的模块”;在非模块化世界中,对此的最佳近似是“相同的包”。

所以是的,如果您使用模块,您会获得一些额外的灵活性,因为模块为您提供了安全边界。

  • @Ipandzic 不,那不对。密封类在没有模块的情况下也能正常工作;它只是意味着共同维护的边界是包。如果您使用模块,您将获得更大的自由度,边界是该模块中的所有包。你可以认为这是一种积极的互动;您可以使用不带模块的密封,或不带密封的模块,或同时使用两者,如果将它们一起使用,您将获得一些额外的灵活性。

以上是不同包中类的密封类的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>