[更新]真实情况比我看起来最初的问题稍微复杂一些。 [/ UPDATE]当类型为通配符时如何将泛型结果用作泛型参数?
我有点被以下行为难住了。鉴于这样的代码:
interface Inter<T> {
T makeT();
void useT(T t);
}
public class Foo {
public void bar(Qux q) {
Inter<?> x = getInterForQux(q);
x.useT(x.makeT());
}
Inter<?> getInterForQux(Qux q) {
if(someTest(q)) {
return (Inter<Integer>) mkAnInterInt();
} else {
return (Inter<Double>) mkAnInterDouble();
}
}
}
javac的给我的错误:
useT(capture#478 of ?) in Inter<capture#478 of ?> cannot be applied to (java.lang.Object)
而Eclipse的给我:
The method useT(capture#1-of ?) in the type Inter<capture#1-of ?> is not applicable for the arguments (capture#2-of ?)
显然,不管是什么T
是makeT()
结果类型是与参数类型useT()
相同。为什么我不能这样做?有没有解决方法?
实际情况并非如此琐碎这给你
bar
相同的签名,如上所述。首先,'bar'实际上是一种接口方法,所以我不能只在其上粘贴类型量词。但我认为你总是可以重构代码,通过将T的“范围”推入私有方法为量词腾出空间。 – 2010-01-28 22:33:37