javac允许文件名与某些系统中的类名不同

  • 本文关键字:系统 文件名 javac java
  • 更新时间 :
  • 英文 :


我的类是

public class Foo {}

文件名为Test.java

但在我的系统中,当我编译它时,显示了以下错误

test.java:1: class Foo is public, should be declared in a file named Foo.java
public class Foo {
       ^
1 error

但在我朋友的系统中,它正在被编译,我们都在使用oracle JDK

有人能解释为什么吗??

您是否确定它在您朋友的系统中仍然是公共的?这会让我感到惊讶——如果你们都使用OracleJDK中的javac进行编译,我希望双方都会抱怨。

也就是说,它没有是一个错误。它是可选的。来自JLS第7.6节:

如果且仅当包存储在文件系统中(§7.2),主机系统可以选择强制执行限制,即如果在文件中未找到由类型名加上扩展名(如.java或.jav)组成的类型,则这是编译时错误,如果以下任一项为真:

  • 该类型由声明该类型的包的其他编译单元中的代码引用。

  • 该类型被声明为公共类型(因此可以从其他包中的代码中访问)。

重点是我的,但请注意,这是一个可选的限制。

对于Oracle JDK中的javac,您所看到的是不可能的:

源代码文件名必须具有.java后缀,类文件名必须有.class后缀,并且源文件和类文件都必须具有标识类的根名称。例如,一个名为MyClass的类将被写在一个称为MyClass.java的源文件中,并被编译成一个名名为MyClass.class.的字节码类文件

因此,请仔细检查您是否使用了完全相同的源代码(Foo在两者中都是公共的吗?)并且确实使用了Oracle JDK。

此要求特定于Oracle JDK。其他实现可能会违反这一点,因为根据JLS:,这是可选的

如果且仅当包存储在文件系统中(§7.2),主机系统可以选择强制执行限制,即如果在由类型名加扩展名(如.java或.jav)组成的名称下的文件中找不到类型,则这是编译时错误,如果以下任一项为真:

  • 该类型由声明该类型的包的其他编译单元中的代码引用。

  • 该类型被声明为公共类型(因此可以从其他包中的代码中访问)。

这个限制意味着每个编译单元最多只能有一个这样的类型。这种限制使得Java编译器可以很容易地在包中找到命名类。在实践中,许多程序员选择将每个类或接口类型放在自己的编译单元中,无论它是公共的还是被其他编译单元中的代码引用。

相关内容

最新更新