我发现了泛型的以下问题.考虑通用接口
public interface A<X> {
X get();
void doStuff(X x);
}
Run Code Online (Sandbox Code Playgroud)
现在,让我们假设以下方法定义:
public <T extends A<?>> void foo(T t) {
bar(t);
}
Run Code Online (Sandbox Code Playgroud)
由于通配符,get()的返回类型的类型信息不足.因此,我必须委托另一个方法将这个通配符"绑定"到一个新的类型变量:
private <X> void bar(A<X> t) {
X x = t.get();
t.doStuff(x);
}
Run Code Online (Sandbox Code Playgroud)
不允许在foo中调用bar(),编译器输出以下错误消息:
类型测试中的方法栏(A)不适用于参数(T)
但是,如果我将方法foo()更改为
public <T extends A<?>> void foo(T t) {
A<?> u = t; // No explicit cast required, no "unchecked" warning!
bar(u);
}
Run Code Online (Sandbox Code Playgroud)
有用.为什么?这是编译错误吗?对此有任何意见将非常感谢.
笔记:
我检查了代码:
public class Test
{
public interface A<X> {
X get();
void doStuff(X x);
}
public <T extends A<?>> void foo(T t) {
bar(t);
}
private <X> void bar(A<X> t) {
X x = t.get();
t.doStuff(x);
}
}
Run Code Online (Sandbox Code Playgroud)
有用。javac 1.6.0_22。你哪里有错误?或者我使用另一个代码?