2012-10-13 12 views
8

Aşağıdaki kod sadece varargs parametresi olarak null başvurusunu kullanır.Varargs'de boş parametreler yok

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

[null, null] gösterir temp(null, null); yöntem ilk çağrı bu str[0]=null ve str[1]=null anlamına gelir.

ama temp(null); daha sonra çağrı NullPointerExceptionstr kendisi null olduğunu görünen atılmasına neden olur.

Stringtemp((String)null); gibi bir şeye yazılırsa, çalışır ve [null] görüntüler.

Son çağrıda neden açık bir tür döküm gerekiyor? Bana öyle geliyor ki, ilk çağrıdan farklı bir null referansı ile bir dizi dizisi olarak kabul edilir. Doğru cevap nedir?

cevap

12

O

Tam ilk çağrıdan farklı bir boş referansla bir dize dizisi olarak kabul edilir geliyor bana. Bu ne oluyor. exact-match, var-args, boxing ve type-casting -:

Aslında, sadece yaklaşık precedence arasında.

Derleyici çağrılacak yöntemleri için denetlerken aşağıdaki öncelik izleyebilir veya değişken geçti nasıl: -

Tam Eşleşme> Type-Cast> Boks> Var-args

Bunu görebildiğiniz gibi, var-args en düşük önceliğe sahiptir ve exact-match en yüksek önceliğe sahiptir. Yani, bir argument, bir exact-match için good-enough ise, o zaman böyle kabul edilecektir. Eğer bağımsız değişken olarak null geçerken

Şimdi, daha sonra null doğrudan value of reference olarak var-args parametreye geçirilebilir. Parametre için exact match'dur.
Yani, var-args parametrenin onun aslında ilk eleman

null, null durumunda, bu var-args ait two elemanları alınacaktır Oysa söylemek String açık şekilde typecast gerekir. value of reference olamaz.

+0

'Dize str = null; Arrays.asList (str); 'çalışıyor, neden? –

+0

'Arrays.asList (str);' 'java.util.List', içinde' null' girişi ile yapılandırır. 'String str = null;' oluşturulmakta olan 'List' referansıyla hiçbir ilgisi yoktur ('null' değil). – Tiny

+0

@Tiny. Kesinlikle :) –