3

Oracle http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.htmlが提供する Java チュートリアルから直接こんにちは

static void filter(Collection<?> c) {
    for (Iterator<?> it = c.iterator(); it.hasNext(); )
        if (!cond(it.next()))
            it.remove();
}

コンパイル時の型消去を認識しています。また、タイプ (無制限) がオブジェクトに置き換えられることも認識しています。コンパイル時に無制限のワイルドカードを使用してコンパイラが行うことを認識していますか? 生タイプだったので外すだけ?

前もって感謝します。

4

2 に答える 2

3

ジェネリック宣言があるとします

interface Foo<T>
    T get();
    void set(T);
    void bet();

生の型Fooは、次のように宣言された型と同等です。

interface Foo
    Object get();
    void set(Object);
    void bet();
    // all generics info are stripped

たとえば、Java 5 には がありList<E>、その raw バージョンListには、Java5 以前のインターフェースとまったく同じメソッド シグネチャが含まれていListます。raw 型は下位互換性のために使用されます。

Rawは;Listにかなり近いです。List<Object>しかし、とは大きく異なりますList<?>


型のオブジェクトfooの型Foo<?>

interface Foo<X>
    X get();
    void set(X);
    void bet();

X は不明ですが、決定的なものについては、X を入力します。X は不明ですが、foo.get()andを呼び出すことができfoo.bet()ます。しかし、 isでない限り、 が不明な型であるfoo.set(a)かどうかを知る方法がないため、呼び出すことはできません。aXanull

于 2013-03-22T16:27:09.630 に答える
-1

これは以前に回答されています: Java Generics - 無制限のワイルドカードには実際には何がありますか? たとえば、バインドされていないワイルドカードと生の型の違い

そうです、<?>生の型は (実行時に) 同一です。

于 2013-03-22T11:11:57.410 に答える