我发现泛型存在以下问题,考虑以下泛型接口:
public interface A<X> {
X get();
void doStuff(X x);
}
现在,假设有以下方法定义:
public <T extends A<?>> void foo(T t) {
bar(t);
}
由于通配符的存在,get()方法返回类型的类型信息不足。因此,我不得不委托另一个方法将这个通配符“绑定”到一个新的类型变量上:
private <X> void bar(A<X> t) {
X x = t.get();
t.doStuff(x);
}
在 foo 中调用 bar() 是不允许的,编译器会输出以下错误信息:
类型 test 中的方法 bar(A) 对参数 (T) 不适用。
但是,如果我将方法 foo() 更改为
public <T extends A<?>> void foo(T t) {
A<?> u = t; // No explicit cast required, no "unchecked" warning!
bar(u);
}
它起作用。为什么?这是编译器错误吗?非常感谢任何对此的评论。
备注:
- 我之所以不简单地声明方法 foo 为 void foo(A),是因为我实际上正在使用上界交集(&)。
- 我之所以不在 foo() 中声明 X 为类型变量,是因为我实际上在类级别上遇到了这个问题,并且不想不必要地增加该类的类型参数数量。