8

次のコードは、varargsパラメーターとしてnull参照を使用するだけです。

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

temp(null, null);メソッドdisplaysへの最初の呼び出しは、それとを[null, null]意味しstr[0]=nullますstr[1]=null

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

Stringこのような型キャストの場合temp((String)null);、動作して表示されます[null]

なぜ最後の呼び出しで、明示的な型キャストが必要なのですか?最初の呼び出しとは異なる参照を持つ文字列配列と見なされているように思われます。null正解は何ですか?

4

1 に答える 1

12

最初の呼び出しとは異なるnull参照を持つ文字列配列と見なされているように思われます

その通り。これが起こっていることです。

実際には、それはちょうど次の間にありますprecedence:- exact-match、、、および。var-argsboxingtype-casting

コンパイラは、呼び出されるメソッド、または引数が渡​​される方法をチェックするときに、次の優先順位に従います。

完全一致>型キャスト>ボクシング>Var-args

var-argsつまり、優先順位が最も低く、優先順位が最も高いことがわかりますexact-match。つまり、anがtheの場合、そのようargumentに見なされます。good-enoughexact-match

これでnull、引数として渡すと、パラメータnullに直接渡すことができます。パラメータ用です。 したがって、実際にパラメータの最初の要素であることを明示的に伝える必要がありますvar-argsvalue of referenceexact match
typecastStringvar-args

一方、の場合はnull, nulltwoの要素として扱われますvar-args。それはできませんのでvalue of reference

于 2012-10-13T04:48:43.600 に答える