对于通用接口:
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<Object>
在语法上并不是相同的。
这是怎么回事?我对理解这个问题很困惑。
Foo<?>
变量中,它不会知道String
参数。因此,如果Foo
有任何接受类型为T
的参数的方法,唯一允许的值将是null
,如果它有任何返回T
的方法,它将被视为Object
。 - Taymon