Se eu tiver um método Java vararg foo(Object ...arg)
e chamar foo(null, null)
, tenho tanto arg[0]
e arg[1]
como null
s. Mas se eu ligar foo(null)
, arg
ele mesmo é nulo. Por que isso está acontecendo?
Como devo chamar foo
de tal forma que foo.length == 1 && foo[0] == null
é true
?
null
language-design
java
variadic-functions
patikrit
fonte
fonte
asList
método na amostra e sua finalidade.asList()
é uma importação estática dajava.util.Arrays
classe. Eu apenas presumi que fosse óbvio. Embora agora que estou pensando sobre isso, eu provavelmente deveria ter apenas usado,Arrays.toString()
pois o único motivo pelo qual ele foi convertido em uma lista é para que tenha uma impressão bonita.Você precisa de um elenco explícito para
Object
:Caso contrário, o argumento é assumido como todo o array que o varargs representa.
fonte
Um caso de teste para ilustrar isso:
O código Java com uma declaração de método vararg-taking (que por acaso é estática):
Este código Java (um caso de teste JUnit4) chama o acima (estamos usando o caso de teste não para testar nada, apenas para gerar alguma saída):
Executá-lo como um teste JUnit produz:
Para tornar isso mais interessante, vamos chamar a
receive()
função do Groovy 2.1.2 e ver o que acontece. Acontece que os resultados não são os mesmos! Isso pode ser um bug.Executar isso como um teste JUnit produz o seguinte, com a diferença para Java destacada em negrito.
fonte
Isso ocorre porque um método varargs pode ser chamado com uma matriz real em vez de uma série de elementos da matriz. Quando você fornece o ambíguo
null
sozinho, ele assume quenull
é umObject[]
. Transmitirnull
paraObject
corrigirá isso.fonte
eu prefiro
para evitar exceções de ponteiro nulo.
Espero que ajude.
fonte
foo()
?A ordem para resolução de sobrecarga de método é ( https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.12.2 ):
foo(null)
coincidefoo(Object... arg)
comarg = null
na primeira fase.arg[0] = null
seria a terceira fase, o que nunca acontece.fonte