web-dev-qa-db-ja.com

`System.out.println(null);`が「メソッドprintln(char [])がタイプPrintStreamエラーに対してあいまいである」と表示するのはなぜですか?

私はコードを使用しています:

System.out.println(null);

それはエラーを示しています:

The method println(char[]) is ambiguous for the type PrintStream

nullObjectを表さないのはなぜですか?

21

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);
_
25
Eran

System.println(null)を呼び出すと、複数の候補メソッドがあります(char []StringおよびObject引数)、コンパイラーはどちらを使用するかを決定できません。

修正
nullへの明示的なキャストを追加します。

System.out.println((Object)null);

または、 nullオブジェクトパターン を使用します。


なぜnullはオブジェクトを表さないのですか?

から JLS 4.1タイプと値の種類

名前のない特殊なnull型、null式の型もあります。
null型には名前がないため、null型の変数を宣言したり、null型にキャストしたりすることはできません。
null参照は、null型の式の唯一の可能な値です。 null参照は、常に任意の参照型にキャストできます。
null参照は、いつでも任意の参照型に割り当てたりキャストしたりできます

実際には、プログラマーはnull型を無視して、nullが任意の参照型になることができる特別なリテラルであると偽ることができます

したがって、nullのタイプはnotObjectですが、(に割り当てられた読み取り)に変換できます。 Object

8
Gyapti Jain