9

このOracle Java チュートリアルから:

WildcardError の例では、コンパイル時にキャプチャ エラーが発生します。

public class WildcardError {

    void foo(List<?> i) {
        i.set(0, i.get(0));
    }
}

このエラー デモンストレーションの後、ヘルパー メソッドを使用して問題を修正します。

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));
    }
}

iまず、リストの入力パラメーター ( ) は次のように見なされると彼らは言いますObject

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

では、なぜ をi.get(0)返さないのObjectですか? すでに渡されている場合は?

さらに、 when を使用するポイントは何ですか。<?>次に、 を使用してヘルパー メソッドを使用する必要があります<T>T推測できるものを直接使用したほうがよいのではないでしょうか?

4

1 に答える 1

4

List<?>は未知の型のオブジェクトのリストを意味します. と同じではありませんList<Object>.

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

于 2013-06-27T11:12:53.520 に答える