考虑代码:
public class A<T extends X> {
public static interface Delegate {
void doMagic(T t); // why can't I access "T" here?
}
public A(Delegate delegate) { ... }
}
...
public class TheDelegate implements A<Y> { ... }
...
A<Y> a = new A<Y>(new A<Y>.Delegate() {
@Override
public void doMagic(Y y) {
...
}
});
为什么我无法从T
界面访问Delegate
?
答案 0 :(得分:6)
这是因为你的内部接口是静态的。泛型参数仅适用于A
的实例,而不是应用于类,因此T的范围是A的非静态范围。
如果您不知道,所有接口和枚举在Java中都是静态的,即使它们未声明为静态且位于另一个类中。因此,无法使用界面解决此问题。
编辑:史蒂文的回答是正确的。但是,您的用户代码如下所示:// Note the extra declaration of the generic type on the Delegate.
A<Integer> a = new A<Integer>(new A.Delegate<Integer>() {
@Override
public Integer myMethod() {
return null;
}
});
答案 1 :(得分:5)
您的内部接口可以有自己的通用边界。尝试声明并将其用作Delegate<T>
,它应该可以正常工作。