当前位置: 首页 > 知识库问答 >
问题:

不同包中类的密封类

唐景山
2023-03-14

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

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和这个部分:

许可指定的类必须位于超类附近:在同一个模块中(如果超类在命名模块中)或在同一个包中(如果超类在未命名模块中)。

然而,Maven在编译时不应该默认使用类路径吗?这一限制是否可以避免?

如果没有,这是否开创了一个先例,模块路径上的特性比类路径上的特性更灵活,反过来——虽然类路径仍然受支持,但与模块路径相比,它不像以前那样是一等公民?

共有1个答案

易雅畅
2023-03-14

类路径是未命名的模块。

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

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

 类似资料:
  • 下面的代码在无法通过条件颜色时编译。深色和彩色。浅色,因为这两个类是抽象的。 我错过什么了吗?

  • 我有下面的Kotlin代码。一个名为的密封类和两个对象类和继承自密封类。我在is Cat情况下的子句中得到这个错误。 为什么会给出这个错误?如何使用Kotlin中的密封类来进行这种类型的操作?密封类是做多态的好选择吗?

  • 假设我有一个从Point2D继承的类Point3D和一个从Drawing2D继承的类Drawing3D。 我希望两个类Drawing2D和Drawing3D具有相同的属性名Points,这将是Drawing2D的Point2D列表,以及Drawing3D的Point3D列表。 由于具有相同的属性名,我希望Drawing3D能够在属性点上受益于Drawing2D方法。问题是我不能使用覆盖,因为类型不

  • 主要内容:Java16 sealed密封类的示例Java 15 引入了一个密封类作为预览功能,它提供了对继承的细粒度控制。Java 16 提供了一些小的增强功能,并将此功能保留为预览版。以下是密封类需要考虑的要点 : 密封类是使用 sealed 关键字声明的。 密封类允许使用 permit 关键字声明哪个类可以是子类型。 扩展密封类的类必须声明为sealed 、non-sealed或final的。 密封类有助于在继承中创建有限且可确定的类层次结

  • 主要内容:Java15 sealed 密封类的示例Java 15 引入了一个密封类作为预览功能,它提供了对继承的细粒度控制。以下是密封类需要考虑的要点 : 密封类是使用 sealed 关键字声明的。 密封类允许使用 permit 关键字声明哪个类可以是子类型。 继承密封类的类必须声明为sealed 、non-sealed或final的。 密封类有助于在继承中创建有限且可确定的类层次结构。 Java15 sealed 密封类的示例 ApiTeste