是否有一个Java编译器,如果“该类型由包的其他编译单元中的代码引用,则每个文件不允许多个类”?

时间:2016-02-19 19:55:12

标签: java javac jls

通常,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
$ 

0 个答案:

没有答案