0
class VarArgs {
    public static void printArray(Object... args) {
        for (Object obj : args)
            System.out.print(obj + " ");
        System.out.println();
    }

    public static void main(String[] args) {
        printArray( new Integer[] { 1, 2, 3 });
    }
}

コンソールの出力は次のとおりです。

   [Ljava.lang.Integer;@1888759 

この出力が何であるかを知りたいだけです。想定されるキャストは Object[] を介して行われ、出力として 1,2,3 が得られますが、キャストに Object を使用すると、この出力が得られます

4

4 に答える 4

1

使用できます

Arrays.toString(new Integer[]{1,2,3}); 

配列の実際の内容を表示します。

または、新しい Integer[]{1,2,3} を Object の代わりに Object[] にキャストします。つまり:

printArray((Object[])new Integer[]{1,2,3});
于 2013-05-31T14:03:40.030 に答える
0

Marco が言ったように、これは Object のデフォルトの toString メソッドを使用します。これはその (仮想) メモリ アドレスです。

ここでは Arrays.toString メソッドを使用することをお勧めします

可変引数の使用に関して - 実行してクラスファイルを逆アセンブルしてみてください

javap -verbose VarArgs

これが何にコンパイルされるかを確認するには、整数配列が配列の単一要素として渡されていることを確認してください。

于 2013-05-31T14:05:51.770 に答える
0

それは配列を渡すことと同じではありません! これは、可変長のパラメーターを渡すことと同じであるため、メソッドは配列をオブジェクトの配列ではなく 1 つのオブジェクトとして扱い、出力します。

public static void printArray(Object[] args) {
    for (Object o : args) {
        System.out.println(o);
    }
}

Object[] objects = new Integer[] { 1, 2, 3, 4 };
printArray(objects);

int のラッパーを使用する必要があることに注意してください。プリミティブ型はオブジェクトのサブクラスではありません。

于 2013-05-31T14:03:55.000 に答える
0
  • コードで何が起こっているかの説明:

    1. メソッドを呼び出しているときはprintArray、配列をにキャストしているObjectため、実際には (配列ではなく) 1 つのオブジェクトだけを渡しています。

    2. メソッドの foreach ループは、 1 つの引数 (配列) のみがメソッドprintArrayに渡されているため、1 回だけ繰り返されます。printArrayInteger[] {1,2,3}

    3. したがって、コードが を呼び出している場合、toString予想されるようにクラスからtoStringではなく、Array クラスからが呼び出されます。toStringInteger

    4. 最後に得られた結果: Java の配列クラスにメソッドが[Ljava.lang.Integer;@1888759実装されていないことが原因です。toString

  • コードで問題を修正するには:

    交換:

    printArray((Object)new Integer[]{1,2,3});
    

    と:

    printArray((Object[])new Integer[]{1,2,3});
    
  • 配列呼び出しの内容を出力するには:

    Arrays.toString(new Integer[]{1,2,3}); 
    
于 2013-05-31T14:04:42.533 に答える