我有以下课程结构,
abstract class AbstractA {...}
class A1 extends AbstractA {...}
class A2 extends AbstractA {...}
abstract class AbstractB<T extends AbstractA> {
public void handle(T a) { ... }
}
class B1 extends AbstractB<A1> {
public void handle(A1 a) {
super.handle(a);
...
}
}
class B2 extends AbstractB<A2> {
public void handle(A2 a) {
super.handle(a);
...
}
}
现在我想实现一个泛型方法,该方法将AbstractB和相关的AbstractA列表作为参数。 e.g。
Handler.<B1, A1>handle(listOfB1, A1);
Handler.<B2, A2>handle(listOfB2, A2);
和
Handler.<B1, A2>handle(listOfB1, A2);
Handler.<B2, A1>handle(listOfB2, A1);
是不允许的。
我试过
class Handler {
// public static <T extends AbstractB<K extends AbstractA>, K extends AbstractA> handle(List<T> list, K a) {
public static <T extends AbstractB<? extends AbstractA>, K extends AbstractA> handle(List<T> list, K a) {
for (T tmp : list) {
tmp.handle(a);
}
}
}
但两者都没有编译。任何人都可以帮助并给我任何线索吗?谢谢!
答案 0 :(得分:2)
将其更改为:
public static <T extends AbstractB<K>, K extends AbstractA> void handle(List<T> list, K a) {
for (T tmp : list) {
tmp.handle(a);
}
}
请注意,您的方法缺少返回类型(我假设您打算使用返回类型)。
但是,主要问题是T
的类型范围应该是extends AbstractB<K>
而不是extends AbstractB<? extends AbstractA>
。
考虑当前静态句柄方法定义中会发生什么。 静态方法的当前签名允许此调用:
List<B1> listOfB1;
Handler.<B1, A2>handle(listOfB1, A2);
但是在静态方法的主体中,您无法将A2
实例传递给B1
实例的句柄方法,这就是您的代码无法通过的原因汇编。因此,T的类型界限必须取决于K.