2012-10-13 20 views
8

Poniższy kod po prostu używa pustego odwołania jako parametru varargs.Varargs z parametrami pustymi w Javie

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); 
    } 
} 

Pierwsze wywołanie metody temp(null, null); wyświetla [null, null] oznacza, że ​​str[0]=null i str[1]=null.

, ale późniejsze połączenie z numerem temp(null); powoduje wygenerowanie NullPointerException, co oznacza, że ​​sama nazwa str to null.

Jeśli jest to typ odlany na String coś podobnego do tego temp((String)null);, działa i wyświetla [null].

Dlaczego podczas ostatniego połączenia wymagany jest wyraźny rzut czcionki? Wydaje mi się, że jest to tablica znaków o numerze referencyjnym null, która różni się od pierwszej. Jaka jest prawidłowa odpowiedź?

Odpowiedz

12

Wydaje mi się, że jest on uważany za tablicą ciąg o zerowej odniesienia, który różni się od pierwszego wezwania

Dokładnie. Oto co się dzieje.

Właściwie, to tylko o precedence pomiędzy: - exact-match, var-args, boxing i type-casting.

Compiler wykonaj następujące pierwszeństwo przy sprawdzaniu metod nazwać, albo jak argument zostanie przekazana: -

Dokładne meczu> Type-Cast> Boks> Var-args

Widać więc, że var-args ma najniższy priorytet, a exact-match ma najwyższy priorytet. Oznacza to, że jeśli argument jest good-enough dla exact-match, wówczas będzie traktowany jako taki.

Teraz, kiedy przechodzą null jako argument, a następnie null mogą być przekazywane bezpośrednio do parametru var-args jako value of reference. Jest to exact match dla parametru.
Więc trzeba typecast go wyraźnie do String powiedzieć, że jej faktycznie pierwszy element swojego parametru var-args

Natomiast w przypadku null, null, to zostanie uznany za two elementów swojej var-args. Ponieważ nie może to być value of reference.

+0

'String str = null; Arrays.asList (str); 'działa, dlaczego? –

+0

'Arrays.asList (str);' tworzy 'java.util.List' z wpisem' null'. 'String str = null;' nie ma nic wspólnego z referencją tworzonej 'List' (która nie ma wartości" null "). – Tiny

+0

@ Tiny. Dokładnie :) –