は、次のコードを考えてみましょう:ネストしたクラスと同じ名前のクラスをインポートするのはなぜですか?
import java.util.Calendar;
class Demo
{
class Calendar {}
public static void main (String[] args) {
// System.out.println(Calendar.DAY_OF_WEEK); // Would be an error.
}
}
このコードは、罰金コンパイルします。 Calendar
をDemo
に記載している場合は、Demo.Calendar
であり、java.util.Calendar
ではありません。
インポートは明らかに冗長です。しかし、あなたが(JLS Sec 7.5.1あたり)同じコンパイル単位で定義されているトップレベルのクラスと同じ単純名を持つクラスをインポートすることができていない考慮すると、それが許可されていることを奇妙に思える:
import java.util.Calendar; // error: Calendar is already defined in this compilation unit
class Calendar {}
があります最初のコード例のようなインポートがコンパイル時エラーではないという実用的な理由はありますか?
import java.util.Calendar;
class Demo {
static class Nested {
static class Calendar {}
static void useNested() {
System.out.println(Calendar.class); // Demo.Nested.Calendar
}
}
static void useImported() {
System.out.println(Calendar.class); // java.util.Calendar
}
public static void main(String[] args) {
Nested.useNested();
useImported();
}
}
この場合:インポートと同じ名前を持つ二回(またはそれ以上)-nestedクラスを持っているところ
冗長ではありません。それは効果がない。これは、言語仕様がそれを禁じていないため、これが正当であると確信しています。おそらく、それは言語設計者によって考慮されないケースです。 – davmac
あなたはJLSを誤読しました。トップレベルのクラスと同じ名前をインポートすることは禁止されていません。 "コンパイル単位がシンプルな名前が' n 'であるトップレベル[sic]型も宣言している場合、名前のインポートは禁止されます。それはあなたが示す状況ではありません。 –
@LewBloch私はあなたが指摘している違いを理解していません。違いを実証するための例を教えてください。 –