Что на самом деле означает подстановочный знак параметра типа в Java? В чем реальная разница между Foo и Foo?

Для универсального интерфейса:

public interface Foo<T> {
    void f(T t); 
} 

Разница между двумя полями:

public class Bar {
    Foo foo1; 
    Foo<?> foo2; 
}

В том, что foo2 — это универсальный тип, а foo — нет. Поскольку ? является подстановочным знаком (что, я думаю, означает любой тип), а каждый тип является подтипом Object, то я ожидаю, что Foo и Foo< Object> на семантически и синтаксически эквивалентный.

Однако обратите внимание на следующее:

public class Puzzler {
    void f() {
        Integer i = null; 
        Foo<?> foo1 = null;
        foo1.foo(i); // ERROR 
        Foo foo2 = null; 
        foo2.foo(i); // OKAY
        Foo<Integer> foo3 = null; 
        foo3.foo(i); // OKAY 
        Foo<Object> foo4 = null; 
        foo4.foo(i); // OKAY
    }

    private interface Foo<T> {
        void foo(T t);
    } 
}

Итак, Foo и Foo — это не синтаксически одно и то же.

Что здесь происходит? Я довольно застрял, пытаясь понять это.

8
задан mwsltn 7 March 2012 в 01:56
поделиться