javacOracle JDKからは、あなたが目撃していることは不可能です:
ソース コード ファイル名には .java サフィックスが必要であり、クラス ファイル名には .class サフィックスが必要であり、ソース ファイルとクラス ファイルの両方にクラスを識別するルート名が必要です。たとえば、MyClass というクラスは、MyClass.java というソース ファイルに記述され、MyClass.class というバイトコード クラス ファイルにコンパイルされます。
したがって、まったく同じソースを使用していること (Foo両方で公開されていますか?) と、実際に Oracle JDK を使用していることを再確認してください。
この要件は、Oracle JDK に固有のものです。JLSごとにオプションであるため、他の実装はこれに違反する可能性があります。
パッケージがファイル システム (§7.2) に格納されている場合に限り、ホスト システムは、型名で構成される名前のファイルに型が見つからない場合、コンパイル時エラーであるという制限を適用することを選択できます。次のいずれかに該当する場合は、拡張子 (.java または .jav など) を追加します。
この制限は、コンパイル単位ごとにそのような型が最大で 1 つ存在する必要があることを意味します。この制限により、Java コンパイラはパッケージ内の名前付きクラスを簡単に見つけることができます。実際には、多くのプログラマーは、クラスまたはインターフェイスの型をそれぞれ独自のコンパイル単位に配置することを選択します。これは、それが public であるかどうか、または他のコンパイル単位のコードによって参照されるかどうかに関係ありません。