2013-06-27 1 views
8

ヘルパーメソッド:キャプチャワイルドカード

public class WildcardFixed { 
    void foo(List<?> i) { 
     fooHelper(i); 
    } 

    // Helper method created so that the wildcard can be captured 
    // through type inference. 
    private <T> void fooHelper(List<T> l) { 
     l.set(0, l.get(0)); 
    } 
} 

まず、th EYリスト入力パラメータ(i)はObjectと見られていると言う:

この例では、コンパイラは、Object型の あるとしてi入力パラメータを処理します。

なぜi.get(0)Objectを返しません。それがすでにそのように渡されたのであれば?

さらに、<T>を使用してヘルパーメソッドを使用する必要がある場合、<?>を使用する点は何ですか?推測することができる直接Tを使用して良くないでしょうか?

+0

これはEclipseが私に与えたものです: 'List 型のメソッドセット(int、capture#1?)は引数には適用できません(int、capture#2-of ?) 'もっとばかげて聞こえます。 –

+0

私は別の質問のためのワイルドカードキャプチャを説明する[回答](http://stackoverflow.com/questions/30797805/understanding-a-captured-type-in​​-java/30798066#30798066)を書いたばかりです。その情報はこの質問にも関係しているようです。 – Lii

答えて

4

List<?>は、不明な種類のオブジェクトのリストを意味します。List<Object>と同じではありません。

i.get(0)のリストの要素の型がわからないため、JavaではObjectとみなされ、をList<?>に追加することはできません。あなたのJavaがよりスマートになるかもしれないが、より複雑なコードで<?>のワイルドカードを使用すると、タイプセーフなものにするのは簡単です。

+0

このようなケースは、Joshua Blochの "Effective Java"の詳細で説明されています。 –

+0

**リスト **は、** List <?オブジェクトを拡張する> ** – Raf