2012-10-13 11 views
8

次のコードでは、null参照をvarargsパラメータとして使用しています。Javaでnullパラメータを持つVarargs

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

そのstr[0]=nullstr[1]=null手段[null, null]を表示temp(null, null);方法の最初の呼び出し。

が後で呼び出されますが、temp(null);を呼び出すとNullPointerExceptionがスローされ、str自体がnullであるように見えます。

タイプがStringの場合はのようにキャストされ、それは動作し、[null]と表示されます。

なぜ最後の呼び出しで、明示的な型キャストが必要ですか? 最初の呼び出しとは異なるnull参照を持つ文字列配列であると考えられます。正解は何ですか?

答えて

12

まさに最初の呼び出し

異なるヌル 参照して文字列の配列であると考えられていますように私には思えます。これが起こっていることです。 exact-matchvar-argsboxingtype-casting - :

実際に、それはちょうど約precedenceの間です。

コンパイラと呼ばれる方法をチェックするとき、次の優先順位に従って、またはどのように引数が渡されます: -

完全一致> TYPE-キャスト>ボクシング>変数-argsを

したがって、var-argsが最も低い優先順位を持ち、exact-matchが最も高い優先順位を持つことが分かります。つまり、argumentexact-matchの場合はgood-enoughである場合、そのようにみなされます。あなたが引数としてnullを渡すとき

は今、そしてnullは直接value of referenceとしてあなたvar-argsパラメータに渡すことができます。パラメータの場合はexact matchです。
だから、あなたはあなたのvar-argsパラメータのその実際に最初の要素が

null, nullの場合には、それはあなたのvar-argstwo要素とさせていただきます、一方ことを伝えるためにStringに明示的にtypecastする必要があります。それはvalue of referenceではありません。

+0

'String str = null; Arrays.asList(str); 'は動作します、なぜですか? –

+0

'Arrays.asList(str);' 'java.util.List'を' null'エントリで構築します。 'String str = null;'は 'List'が作成される(' null'ではない)参照とはまったく関係がありません。 – Tiny

+0

@Tiny。まさに:) –

関連する問題