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 arg
sí mismo es nulo. ¿Por qué está pasando esto?
¿Cómo debo llamar foo
de tal manera que foo.length == 1 && foo[0] == null
es true
?
null
language-design
java
variadic-functions
pathikrit
fuente
fuente
asList
método en la muestra y su propósito.asList()
es una importación estática de lajava.util.Arrays
clase. 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
null
por sí mismo, asume quenull
es unObject[]
. Lanzar elnull
toObject
solucionará 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 = null
en la primera fase.arg[0] = null
sería la tercera fase, que nunca ocurre.fuente