3

Java 7を使用し、varargsメソッドを作成します

public class JavaApplicationTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        addBundleMessage("b", Integer.SIZE, "key", (Object) null);
    }

    public static void addBundleMessage(String bundleName, Integer severity, String key, Object... params) {
        if (params == null)
            System.out.println("params Is null");
        else
            System.out.println("Params not null");
    }
}

オブジェクトをキャストしないと、IDEのNetbeansまたはEclipseが文句を言いますが、コンパイルされます。

最後のパラメーターの引数タイプが不正確なvaragsメソッドの非varargs呼び出し

キャストなしの場合:パラメータがnullで表示されます

nullを(オブジェクト)にキャストすると、nullではないパラメータが表示されます

nullを(Object [])にキャストすると、 paramsがnullと表示されます

それは正常な動作ですか?

4

4 に答える 4

6

はい、それは「通常の」動作です。

混乱は、varargsが後で言語に追加され、可変数のパラメーターを保持するための「実際のパラメーター」として配列を使用して実装されることに起因します。

public static void addBundleMessage(String bundleName, Integer severity,
   String key, Object... params) {

とほぼ同じです

public static void addBundleMessage(String bundleName, Integer severity,
   String key, Object[] params) {

内部的には、パラメータはObject[]としてラップされて渡されます。

ただし、その配列を自分で渡すオプションはまだあります。

を使用する(Object[]) nullと、パラメーター(null)を取得します。

を使用する場合(Object) nullは、varargsメソッドを使用するため、配列を渡してパラメーターを保持します(nullのパラメーターは1つだけです)。

varargsメソッドの「通常の使用」では、paramsがnullになることはありません。取得できる「最悪の」配列は空の配列です(引数がまったくない場合)。

于 2012-06-19T09:00:31.207 に答える
0

キャストはnullに対して何もしません。それは、コンパイラがオーバーロードされたメソッドから選択するのを助けるだけです。マルチパラメータメソッドを使用しているため、パラメータは配列になるため、nullテストは関係ありません。

于 2012-06-19T09:00:53.383 に答える
0

キャストなしの場合:パラメータがnullで表示されます

この場合、varargsはnullであるため、nullを取得します

nullを(オブジェクト)にキャストすると、nullではないパラメータが表示されます

varargsには、nullである1つのオブジェクト(キャストごと)が含まれています

nullを(Object [])にキャストすると、paramsがnullと表示されます

varargs、渡したObject []であり、nullです。

于 2012-06-19T09:02:26.510 に答える
0

キャストなしは、へのキャストありと同じObject[]です。null引数配列を渡しているので、paramsnullです。

nullをにキャストするとObject、単一のnull引数が渡されるため、paramsnullではなく、代わりに、Object[1]要素のみがnullになります。

于 2012-06-19T09:02:40.860 に答える