2012-10-13 15 views
8

Il seguente codice utilizza semplicemente un riferimento null come parametro varargs.Vararg con parametri null in Java

package currenttime; 

import java.util.Arrays; 

public class Main 
{ 
    private static void temp(String...str) 
    { 
     System.out.println(Arrays.asList(str)); 
    } 

    public static void main(String[] args) 
    { 
     temp(null,null); 
     temp(null); 
    } 
} 

La prima chiamata al metodo temp(null, null); mostra [null, null] significa che str[0]=null e str[1]=null.

ma la chiamata più tardi per temp(null); fa sì che il NullPointerException da buttare, che sembra che la stessa è strnull.

Se si digita il tipo su String qualcosa come questo temp((String)null);, funziona e visualizza [null].

Perché nell'ultima chiamata è richiesto un cast di tipo esplicito? Mi sembra che sia considerato un array di stringhe con un riferimento null diverso dalla prima chiamata. Qual è la risposta corretta?

risposta

12

Mi sembra che è considerato come una matrice di stringhe con un null riferimento che è differente dalla prima chiamata

Esattamente. Questo è quello che sta succedendo.

In realtà, si tratta solo di precedence tra: - exact-match, var-args, boxing e type-casting.

Compiler seguire la seguente precedenza durante il controllo per i metodi di essere chiamato, o come sarà passato l'argomento: -

corrispondenza esatta> Type-Cast> Pugilato> Var-args

Quindi, è possibile vedere che, var-args ha la precedenza più bassa e exact-match ha la precedenza più alta. Ciò significa che se uno argument è good-enough per un exact-match, verrà considerato tale.

Ora, quando si passa null come argomento, poi null possono direttamente essere passato al parametro var-args come value of reference. È un exact match per il parametro.
Quindi, è necessario typecast esplicitamente a String per dire che la sua in realtà il primo elemento del vostro parametro var-args

considerando che, in caso di null, null, sarà preso come two elementi della vostra var-args. Come non può essere un value of reference.

+0

'String str = null; Arrays.asList (str); 'funziona, perché? –

+0

'Arrays.asList (str);' costruisce un 'java.util.List' con una voce' null' in esso. 'String str = null;' non ha assolutamente nulla a che fare con il riferimento di 'List' in fase di creazione (che non è' null'). – Tiny

+0

@Tiny. Esattamente :) –