【发布时间】:2012-03-07 01:56:38
【问题描述】:
对于通用接口:
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> 在语法上是不相同的。
这里发生了什么?我很难理解这一点。
【问题讨论】:
-
假设这些是编译错误?
-
@andrewcooke 该代码是有效的;但是,由于该对象将存储在
Foo<?>变量中,因此它不会知道String参数。因此,如果Foo有任何采用T类型参数的方法,则唯一允许的值将是null,如果它有任何返回T的方法,则将其视为Object。跨度> -
对不起,在我看到你的回复之前删除了我的评论。我现在很困惑。捕获什么时候起作用?
-
哦,好的,捕获只与自身完全匹配。很明显,现在我在一些测试代码中看到了编译器错误...
标签: java generics jakarta-ee types