java - ¿Por qué `System.out.println(null);` give “El método println(char[]) es ambiguo para el tipo de error PrintStream”?
(2)
Hay 3 métodos de PrintStream
en PrintStream
que aceptan un tipo de referencia: println(char x[])
, println(String x)
, println(Object x)
.
Cuando pasa null
, los 3 son aplicables. Las reglas de sobrecarga del método prefieren el método con los tipos de argumentos más específicos, por lo que no se elige println(Object x)
.
Entonces el compilador no puede elegir entre los dos primeros, println(char x[])
e println(String x)
, ya que String
no es más específico que char[]
y viceversa.
Si desea que se elija un método específico, convierta el nulo al tipo requerido.
Por ejemplo :
System.out.println((String)null);
Estoy usando el código:
System.out.println(null);
Está mostrando el error:
The method println(char[]) is ambiguous for the type PrintStream
¿Por qué null
no representa a Object
?
Si llama a System.println(null)
existen varios métodos candidatos (con char []
, String
y Object
) y el compilador no puede decidir cuál tomar.
Fijar
Agregar un lanzamiento explícito a nulo.
System.out.println((Object)null);
O utilice un patrón de objeto nulo .
¿Por qué
null
representa a Object?
Desde JLS 4.1 Los tipos de tipos y valores
También hay un tipo nulo especial, el tipo de la expresión null, que no tiene nombre.
Debido a que el tipo nulo no tiene nombre, es imposible declarar una variable del tipo nulo o convertir al tipo nulo.
La referencia nula es el único valor posible de una expresión de tipo nulo. La referencia nula siempre se puede convertir a cualquier tipo de referencia.
La referencia nula siempre se puede asignar o convertir a cualquier tipo de referencia
En la práctica, el programador puede ignorar el tipo nulo y simplemente pretender que nulo es simplemente un literal especial que puede ser de cualquier tipo de referencia.
Por lo tanto, el tipo de null
no es Object
, aunque se puede convertir en un Object
(leído como asignado).