2011-12-03 19 views
3

javaの配列がオブジェクトを拡張することは知っています。なぜそれらをparamsとして渡すのがうまくいかないのですか?それは単一のパラメータとして配列を扱わない理由またなぜプリミティブ型の配列はオブジェクトと見なされないのですか

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

static void foo(Object... params) { 
    System.out.println(params[0]); 
} 

、(ライン1)上記実行から

出力は:Javaでは

1 
[[email protected] 
+1

あなたの問題は何か分かりません。 「うまくいかない」とはどういう意味ですか? –

+0

それは1(行2) –

答えて

5

持つすべての関数(X ...)シグネチャは、パラメータとしてXの配列をとります。

最初の例では、整数の配列をキャストなしでvarargオブジェクトとして渡しているという警告が表示されます。 Javaは、おそらく単一のObjectの代わりにObject []として渡したいと思っていたほど巧妙です。 Object []にキャストを追加すると、警告は消えます。

2番目の例では、配列はすべての配列がオブジェクトであるため、最初のvarargとしてのみ使用されます。プリミティブの配列なので、オブジェクトの配列として渡すことはできません。あなたは、コード

public class Test{ 
    public static void test(Object a) { 
     System.out.println("ok"); 
    } 

    public static void main(String args[]){ 
     int[] i = {1,2,3,4}; 
     test(i); 
    } 
} 

のこのスニペットを実行し検証できるよう、あらゆるタイプの

配列はオブジェクトであるそれは[] int型がオブジェクトであることを意味し、「OK」を印刷します。 〜

+0

の値を印刷しませんが、自動ボクシングはどうですか、なぜそれがオブジェクトにボックス化されないのですか? –

+0

@sleimanjneidi - オートボクシングの仕方ではないからです。 Autoboxingは 'int'を' Integer'に変換しますが、 'int []'を 'Integer []'に変換しません。どうして?それはそれが解決するよりも多くの問題を引き起こすだろうから! –

0

オブジェクト...は、配列を単一のオブジェクトではなく引数のリストとして解釈します。 代わりにセットをコンテナとして使用してみませんか?

3

私はちょうどあなたのコードを試みたが、私が取得:

1 
[[email protected] 

事がある、あなたの方法は、可変引数でObject配列をとります。したがって、最初の呼び出しでは、paramsは、各個別のIntegerを含む3つの要素の配列です。しかし、intsはs(のラッパークラス、Integer、ですが、intではありません)です.2番目の呼び出しでは、paramsは実際の配列オブジェクトを含む1つの要素の配列です。上記のぎこちないのは配列のtoString()メソッドの出力です。

Object[]ではないため、varargsコールをObject[]に置き換えると、2番目のコールはコンパイルされません。

関連する問題