2015-11-01 21 views
11

私は、Javaの "..."配列引数の構文は、配列としてパラメータを受け取ることができます。しかし、私はそれがあまりにもコレクションのためにそうすることに気づい:Javaは自動的にコレクションを引数配列に変換しますか?

public static void main(String[] args) { 
    Collection<Object> objects = new ArrayList<>(); 
    test(objects); 
} 

public static void test (Object...objects) { 
    System.out.println("no compile errors"); 
} 

これは、コンパイルし、私はtoArray()メソッドを呼び出すために必要とせずに実行されます。シーンの後ろで何が起こっていますか?この構文のこの「自動変換」の追加の方法はありますか?

私はJava 1.7を使用しています。

答えて

12

コレクションを配列に変換しません。コレクション自体を最初の可変引数として渡します。したがって、テストメソッドは1つの要素の配列を受け取り、この要素はArrayListです。

これは

System.out.println(Arrays.toString(objects); 

やデバッガを使用してによって

System.out.println("no compile errors"); 

を交換することにより簡単に見つけることができます。この方法は、単一の要素を持つ配列を受け取ります:

4

Collection<Object>はまた、あなたが

Collection<Object> objects = new ArrayList<>(); 
test(objects); 

testを呼び出すときに、それはあなたのコレクションである、単一のパラメータで呼び出されますObjectです。

4

ここで起こっているのは、メソッドが長さ1の配列を受け取り、単一のCollectionを含むことです。これらは、自動箱入り得るとして、それはパラメータの任意のシーケンス、でもプリミティブを受け入れるよう

時間のほとんどは、署名

method(Object... objs) 

は、避けるべきです。

+0

ありがとうございました。そんなことは考えなかった... – Ozilophile

関連する問題