2012-10-13 10 views
8

El siguiente código simplemente usa una referencia nula como parámetro varargs.Varargs con parámetros nulos en 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 primera llamada al método temp(null, null); muestra [null, null] significa que str[0]=null y str[1]=null.

pero la posterior llamada a temp(null); hace que el NullPointerException a ser lanzado el que parece que el str sí es null.

Si se emite tipo String algo así temp((String)null);, funciona y muestra [null].

¿Por qué en la última llamada, se requiere un molde de tipo explícito? Me parece que se considera una matriz de cadenas con una referencia null que es diferente de la primera llamada. ¿Cuál es la respuesta correcta?

Respuesta

12

Me parece que está considerada como una matriz de cadenas con un nulo referencia que es diferente de la primera llamada

Exactamente. Esto es lo que está sucediendo.

En realidad, se trata sólo de precedence entre: - exact-match, var-args, boxing y type-casting.

Compilador seguir el siguiente orden de prioridad en la comprobación de los métodos a ser llamado, o cómo se pasa el argumento: -

> Tipo-Cast> Boxeo> Var-args-coincidencia exacta

Por lo tanto, puede ver que, var-args tiene la precedencia más baja, y exact-match tiene la precedencia más alta. Eso significa que si un argument es good-enough para un exact-match entonces se considerará como tal.

Ahora, cuando se pasa como argumento null, entonces null puede pasarse directamente a su parámetro var-args como el value of reference. Es un exact match para el parámetro.
Por lo tanto, es necesario typecast explícitamente a String decir que es en realidad el primer elemento de su parámetro var-args

Considerando que, en caso de null, null, se toma como two elementos de su var-args. Como no puede ser un value of reference.

+0

'String str = null; Arrays.asList (str); 'funciona, ¿por qué? –

+0

'Arrays.asList (str);' construye una 'java.util.List' con una entrada' null' en ella. 'String str = null;' no tiene nada que ver con la referencia de la 'Lista' que se está creando (que no es' null'). – Tiny

+0

@Tiny. Exactamente :) –

Cuestiones relacionadas