寻求 java 泛型方法的帮助

seek for help on java generic method

我有以下 class 结构,

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 作为参数。例如

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);
    }
  }
}

但两者都不编译。任何人都可以帮助并给我任何线索吗?谢谢!

将其更改为:

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

请注意,您的方法缺少 return 类型(我假设您打算使用 void return 类型)。

但是,主要问题是 T 的类型绑定应该是 extends AbstractB<K> 而不是 extends AbstractB<? extends AbstractA>

考虑一下您当前定义的静态句柄方法中发生了什么。 静态方法的当前签名允许此调用:

List<B1> listOfB1;
Handler.<B1, A2>handle(listOfB1, A2);

但是在静态方法的主体中,您不能将 A2 实例传递给 B1 实例的句柄方法,这就是您的代码无法通过编译的原因。因此 T 的类型界限必须依赖于 K.