Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
寻求有关java泛型方法的帮助_Java_Generics - Fatal编程技术网

寻求有关java泛型方法的帮助

寻求有关java泛型方法的帮助,java,generics,Java,Generics,我有以下的班级结构 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

我有以下的班级结构

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);
    ...
  }
}
抽象类AbstractA{…}
类A1扩展了AbstractA{…}
A2类扩展了AbstractA{…}
抽象类AbstractB{
公共无效句柄(ta){…}
}
类B1扩展了抽象B{
公共无效句柄(A1 a){
超级手柄(a);
...
}
}
类B2扩展了抽象B{
公共无效句柄(A2 a){
超级手柄(a);
...
}
}
现在我想实现一个通用方法,该方法将AbstractB和相关AbstractA的列表作为参数。e、 g

Handler.<B1, A1>handle(listOfB1, A1);
Handler.<B2, A2>handle(listOfB2, A2);
Handler.handle(列表B1,A1);
Handler.handle(列表B2,A2);

Handler.handle(列表B1,A2);
Handler.handle(列表B 2,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);
    }
  }
}
类处理程序{
//公共静态句柄(列表,kA){
公共静态将其更改为:

  public static <T extends AbstractB<K>, K extends AbstractA> void handle(List<T> list, K a) {
    for (T tmp : list) {
      tmp.handle(a);
    }
  }
但是在静态方法的主体中,您不能将
A2
实例传递给
B1
实例的handle方法,这就是为什么您的代码不能通过编译。因此t的类型界限必须依赖于K

  public static <T extends AbstractB<K>, K extends AbstractA> void handle(List<T> list, K a) {
    for (T tmp : list) {
      tmp.handle(a);
    }
  }
List<B1> listOfB1;
Handler.<B1, A2>handle(listOfB1, A2);