私はコードを使用しています:
System.out.println(null);
それはエラーを示しています:
The method println(char[]) is ambiguous for the type PrintStream
null
がObject
を表さないのはなぜですか?
println
には、参照タイプを受け入れる3つのPrintStream
メソッドがあります-println(char x[])
、println(String x)
、println(Object x)
。
null
を渡すと、3つすべてが適用されます。メソッドのオーバーロードルールは、最も具体的な引数タイプのメソッドを優先するため、println(Object x)
は選択されません。
String
は_char[]
_よりも具体的ではないため、コンパイラは最初の2つ(println(char x[])
&println(String x)
)から選択できません。その逆も同様です。
特定のメソッドを選択する場合は、必要なタイプにnullをキャストします。
例えば :
_System.out.println((String)null);
_
System.println(null)
を呼び出すと、複数の候補メソッドがあります(char []
、String
およびObject
引数)、コンパイラーはどちらを使用するかを決定できません。
修正
nullへの明示的なキャストを追加します。
System.out.println((Object)null);
または、 nullオブジェクトパターン を使用します。
なぜ
null
はオブジェクトを表さないのですか?
名前のない特殊なnull型、null式の型もあります。
null型には名前がないため、null型の変数を宣言したり、null型にキャストしたりすることはできません。
null参照は、null型の式の唯一の可能な値です。 null参照は、常に任意の参照型にキャストできます。
null参照は、いつでも任意の参照型に割り当てたりキャストしたりできます
実際には、プログラマーはnull型を無視して、nullが任意の参照型になることができる特別なリテラルであると偽ることができます
したがって、null
のタイプはnotObject
ですが、(に割り当てられた読み取り)に変換できます。 Object
。