Для универсального интерфейса:
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
— это не синтаксически одно и то же.
Что здесь происходит? Я довольно застрял, пытаясь понять это.