java - 不同包中的类的密封类

标签 java sealed-class java-17

如果我声明遵循密封的层次结构

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 不应该在编译时使用类路径吗?可以完全避免这种限制吗?
如果不是,这是否开创了一个先例,模块路径上的功能比类路径上的更灵活,反过来 - 虽然仍然支持类路径,但与模块路径相比,它不像以前那样是一等公民?

最佳答案

类路径是未命名的模块。
动机是密封类及其(直接)子类紧密耦合,因为它们必须一起编译和维护。在模块化世界中,这意味着“相同的模块”;在非模块化世界中,对此的最佳近似是“相同的包”。
所以是的,如果你使用模块,你会得到一些额外的灵 active ,因为模块给你的安全边界。

关于java - 不同包中的类的密封类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68496244/

相关文章:

java Filter 类 doFilter() 没有被调用

java - 使用 jackson-dataformat-xml 转义引号

Java 可扩展枚举

functional-programming - 表示所有扩展 "base"记录的记录总和类型概念的规范方法

spring-boot - IntelliJ Gradle 构建失败 : Incompatible because component compatible with Java 17 and the consumer needed Java 11

java - 有关如何在 GWT 项目中连接到 MS SQL Server 的任何示例或教程

kotlin - 将密封类声明为对象的好处

kotlin - 当 "when"语句未涵盖所有实现时,强制编译器发出错误

EasyMock 测试在 Java 17 上因 java.lang.NoClassDefFoundError org.easymock.internal.ClassProxyFactory$2 失败

java - 为什么 UnixSystem().getUsername() 返回 null(Docker 中的 OpenJDK 17)