java - 为什么我不必要求 java.base?
问题描述
当我尝试 importjavax.swing.JFrame
时,eclipse 会抱怨,因为我需要明确告诉我的包我将从java.desktop
模块中导入东西。所以我把requires java.desktop
我的module-info.java
,然后java编译器知道链接这些java.desktop
东西。我的也可以requires java.base
,module-info.java
不过好像没必要。我可以import java.util.Arrays
没有它。
日食是否javac
在幕后为我的选择添加了一些魔法酱?是否javac
自动需要java.base
?为什么我不需要 require java.base
?如果这是编译器魔法,是否还有其他此类特权模块会自动链接到我的包中?
使用 jdk-14,但不确定这是否相关。
解决方案
这是在JLS 7.7.1中指定的:
7.7.1. 依赖
requires 指令指定当前模块所依赖的模块的名称。
requires 指令不得出现在 java.base 模块的声明中,否则会发生编译时错误,因为它是原始模块并且没有依赖项(第 8.1.4 节)。
如果模块的声明不表达对 java.base 模块的依赖,并且模块本身不是 java.base,那么该模块对 java.base 模块具有隐式声明的依赖。
这类似于如何将java.lang
包中的类隐式导入到源文件中。模块不需要显式声明它们依赖于java.base
模块。
推荐阅读
- r - 执行基于相同时间范围的计算
- azure - Azure Synapse Analytics 版本控制
- sql - 根据列值获取行
- python - 使用 Pandas 替换国家名称
- javascript - D3js 轮廓显示为黑框
- mysql - 合并两个表后如何按两个表中具有相同列名的列排序?
- python - request() 在 razorpay 与 django 的集成中得到了一个意外的关键字参数“数量”
- bash - FFprobe 递归搜索文件以输出到 csv
- html - 使用引导程序的网格系统时,我得到了一个奇怪的边距。我将 .container、.row 和 .col-lg-6 边距和填充属性改写为 0
- regex - 如何从 Dart 中的字符串中替换 2 个字符串字母?