Si tengo un método Java vararg foo(Object ...arg)y llamo foo(null, null), tengo ambos arg[0]y arg[1]as null. Pero si llamo foo(null), en argsí mismo es nulo. ¿Por qué está pasando esto?
¿Cómo debo llamar foode tal manera que foo.length == 1 && foo[0] == nulles true?
null
language-design
java
variadic-functions
pathikrit
fuente
fuente

asListmétodo en la muestra y su propósito.asList()es una importación estática de lajava.util.Arraysclase. Simplemente asumí que era obvio. Aunque ahora que lo estoy pensando, probablemente debería haberlo usado,Arrays.toString()ya que la única razón por la que se convierte en una Lista es para que se imprima de forma bonita.Necesitas un elenco explícito para
Object:De lo contrario, se supone que el argumento es la matriz completa que representan los varargs.
fuente
Un caso de prueba para ilustrar esto:
El código Java con una declaración de método de toma de vararg (que resulta ser estático):
Este código Java (un caso de prueba JUnit4) llama a lo anterior (estamos usando el caso de prueba no para probar nada, solo para generar alguna salida):
Ejecutar esto como una prueba JUnit produce:
Para hacer esto más interesante, llamemos a la
receive()función de Groovy 2.1.2 y veamos qué sucede. ¡Resulta que los resultados no son los mismos! Sin embargo, esto puede ser un error.Ejecutar esto como una prueba JUnit produce lo siguiente, con la diferencia con Java resaltada en negrita.
fuente
Esto se debe a que se puede llamar a un método varargs con una matriz real en lugar de una serie de elementos de la matriz. Cuando le proporciona lo ambiguo
nullpor sí mismo, asume quenulles unObject[]. Lanzar elnulltoObjectsolucionará esto.fuente
yo prefiero
para evitar excepciones de puntero nulo.
Espero eso ayude.
fuente
foo()?El orden para la resolución de sobrecarga de métodos es ( https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.12.2 ):
foo(null)coincidefoo(Object... arg)conarg = nullen la primera fase.arg[0] = nullsería la tercera fase, que nunca ocurre.fuente