【发布时间】:2012-01-01 09:31:55
【问题描述】:
我发现泛型存在以下问题。考虑通用接口
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(),编译器输出如下错误信息:
类型测试中的方法bar(A)不适用于参数(T)
但是,如果我将方法 foo() 更改为
public <T extends A<?>> void foo(T t) {
A<?> u = t; // No explicit cast required, no "unchecked" warning!
bar(u);
}
它有效。为什么?这是编译器错误吗?任何有关这方面的 cmet 将不胜感激。
注意事项:
- 我之所以不简单地将方法 foo 声明为 void foo(A) 是因为我实际上使用的是上限类型边界交点 (&)。
- 我之所以不在 foo() 中将 X 声明为类型变量,是因为我实际上在类级别存在问题,并且不想不必要地增加此类的类型参数的数量。
【问题讨论】:
-
您是否使用 -Xlint 编译器标志?如果没有,请尝试使用它进行编译
-
我同意@kan。 java编译器确实编译了这个。我用的是 1.6.0_27。 Eclipse 确实给出了你给出的确切错误,所以也许你正在使用它?
-
使用@kan 的示例创建了 eclipse 错误:bugs.eclipse.org/bugs/show_bug.cgi?id=364200。
-
不使用 javac 1.7.0 编译。