6

Sun の JVM 実装のソース コードimportを調べているときに、あいまいな構文に出くわしました。

import java.awt;

ソース コードを見ると、このimportステートメントはjava.awtパッケージ全体をインポートしているように見えますが、標準ではパッケージ ワイルドカードを使用します: import java.awt.*;. ただし、importステートメントの構文ComponentFactoryは無効であり、JDK または Eclipse ではコンパイルされません。

なぜ Java 開発者は、正しい構文ではなく、このコンパイルできない構文を使用するのでしょう.*か? (開発者は、この構文をサポートする別のコンパイラを使用している可能性がありますか?)

4

2 に答える 2

4

最新のJLS (http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.5.1)を見ると、次のように書かれています。

例 7.5.1-3。サブパッケージのインポートなし

import ステートメントはサブパッケージをインポートできず、タイプのみをインポートすることに注意してください。

たとえば、java.util をインポートしてから、util.Random という名前を使用して java.util.Random 型を参照しようとしても機能しません。

import java.util;   // incorrect: compile-time error
class Test { util.Random generator; }

言語設計者が異なるバージョンの Java を使用している理由はありません。彼らはコーディングとテストのための秘密のツールをいくつか持っているかもしれませんし、いくつかの新機能をテストするかもしれません (しかし、これは新しい機能ではないと思います。新機能は説明なしにこのようにリリースされるべきではないからです)。

.*インポート宣言のすべての部分を自動的に排除するのは、HTML の書式設定だと思います。

于 2013-01-31T04:15:29.743 に答える
1

オラクルが公開したいくつかのドキュメントによると:

注: あまり一般的ではないもう 1 つの形式のインポートを使用すると、囲んでいるクラスの入れ子になった public クラスをインポートできます。たとえば、graphics.Rectangle クラスに、Rectangle.DoubleWide や Rectangle.Square などの便利なネストされたクラスが含まれている場合、次の 2 つのステートメントを使用して、Rectangle とそのネストされたクラスをインポートできます。

import graphics.Rectangle;
import graphics.Rectangle.*;

2 番目の import ステートメントは Rectangle をインポートしないことに注意してください。

ただし、をインポートしようとした後java.awt、これは有効な構文ではないことに気付きました。これは、クラスではなくパッケージにすぎないためです。.*これは、コードを少しきれいに見せるために、ほとんどのインポートの後を単純に省略したコードを公開したと私に信じさせます。とにかく、このようなインポートを書くことはできません。

于 2013-01-31T04:06:08.443 に答える