通常,Java编译器要求公共顶级类位于名称与类名匹配的文件中。这个网站上有很多关于“类吧是公共的,应该在一个名为Bar.java的文件中声明”的问题。
在§7.6中的JLS中提到这是将代码存储在文件(而不是数据库)中的第二个可选限制:
当且仅当包存储在文件系统(第7.2节)中时,如果在由组成的名称下的文件中找不到类型,则主机系统可以选择强制执行编译时错误的限制。如果满足以下任一条件,则类型名称加上扩展名(例如.java或.jav):
该类型由声明类型的包的其他编译单元中的代码引用。
该类型声明为public(因此可以从其他包中的代码访问)。
主流编译器是否会强制执行第一个限制,如果这些类被包中的其他文件引用,那么这些类会在自己的文件中?
javac
版本1.8和1.7似乎不是:
twotype/TwoType.java
:
package twotype;
public class TwoType {}
class Bar {}
twotype/TypeTwo.java
:
package twotype;
public class TypeTwo {
Bar bar; // Do any compilers throw an error here?
}
编译好:
$ javac7 -version
javac 1.7.0_80
$ javac7 twotype/*.java
$
$ javac8 -version
javac 1.8.0_66
$ javac8 twotype/*.java
$