ケース1に割り当てられた理由: 私はパッケージ、java.langのを定義し、このパッケージでStringクラスを定義している:ここでコアStringオブジェクトのカスタム文字列クラスリファレンス
package java.lang;
public class String {
String name = "ABC";
}
私は参照を割り当てることができていますがコアJavaライブラリのStringクラスのオブジェクト( "ABC")への私のカスタムStringクラスの名前( "ABC")。 コンパイラはなぜそうすることができますか?
ケース2: 私は他のいくつかのパッケージに同じ文字列クラスを定義しjava.langplusを言う:予想通り、私は私の参照を代入していますので、
package java.langplus;
public class String {
String name = "ABC"; //compiler error
}
は、その行String name = "ABC";
は、コンパイラエラーがスローされますjava.langplusクラスからコアStringクラスのObjectへのカスタムStringクラス。
コンパイラが完全修飾名が同じであるため、カスタムクラスとコアクラスを区別する方法はありません。 – mm759
これらのいずれかの完全修飾クラス名を使用します。 –
私は、(1)は "String"クラスをロードするために必要なクラスのものを定義するために "実際の" 'String'クラスをブートストラップする必要があると思いますので、コンパイラはそれを特別に扱います。面白い。 –