Java 9嵌套(分层或父/子)模块

Ham*_*eji 1 java java-9

是否可以在Java 9中创建基于继承的(或嵌套的)模块?

像这样的东西:

module a
   |
   ??? module a1
   |   
   ??? module a2
Run Code Online (Sandbox Code Playgroud)

在这个例子中,a1a2模块都是子项a.

如果我导入其中一个子模块,我将获得parent(a)的功能以及该子项中定义的任何功能.也就是说,我可以导入a1,并明确访问两者的功能aa1(但不包括a2).

这两个a1a2是一个a,并且可以访问所有的包a,而无需的包揭露a他们.

Iro*_*che 5

您可以通过组合和语法模拟您要求的内容:requires transitiveexports to

  • requires transitive:指定导入此模块将固有地导入另一个模块.你可以用它来确保a1a2导致a进口.
  • exports to:这将允许您仅将功能导出到特定模块; 这将允许您a提供访问a1a2公开导出危险的功能.

所以,举例来说:

module a {
    exports com.internal to a1;
    exports com.internal to a2;
}

module a1 {
    requires transitive a;
}

module a2 {
    requires transitive a;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果消费者依赖a1,他们将固有地依赖a(从而获得两者的效用),并且com.internal包装虽然a1可供内部使用,但对于消费者而言在外部是不可见的.

这不是你要求的. a1不是一个a.而且,a1 不能成为一个a; 在JLS不允许出口通配符(IE:,exports * to a1仍然不会让a1a,但会使其从务实的角度拉近),并没有其他的语法模块存在允许它.