-1

私のクラスは

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を使用しています

誰でも理由を説明できますか??

4

2 に答える 2

1

javacOracle JDKからは、あなたが目撃していることは不可能です:

ソース コード ファイル名には .java サフィックスが必要であり、クラス ファイル名には .class サフィックスが必要であり、ソース ファイルとクラス ファイルの両方にクラスを識別するルート名が必要です。たとえば、MyClass というクラスは、MyClass.java というソース ファイルに記述され、MyClass.class というバイトコード クラス ファイルにコンパイルされます。

したがって、まったく同じソースを使用していること (Foo両方で公開されていますか?) と、実際に Oracle JDK を使用していることを再確認してください。

この要件は、Oracle JDK に固有のものです。JLSごとにオプションであるため、他の実装はこれに違反する可能性があります。

パッケージがファイル システム (§7.2) に格納されている場合に限り、ホスト システムは、型名で構成される名前のファイルに型が見つからない場合、コンパイル時エラーであるという制限を適用することを選択できます。次のいずれかに該当する場合は、拡張子 (.java または .jav など) を追加します。

  • 型は、型が宣言されているパッケージの他のコンパイル単位のコードによって参照されます。

  • この型は public と宣言されています (したがって、他のパッケージのコードからアクセスできる可能性があります)。

この制限は、コンパイル単位ごとにそのような型が最大で 1 つ存在する必要があることを意味します。この制限により、Java コンパイラはパッケージ内の名前付きクラスを簡単に見つけることができます。実際には、多くのプログラマーは、クラスまたはインターフェイスの型をそれぞれ独自のコンパイル単位に配置することを選択します。これは、それが public であるかどうか、または他のコンパイル単位のコードによって参照されるかどうかに関係ありません。

于 2013-07-05T17:49:55.003 に答える