寻求java泛型方法的帮助

时间:2015-02-01 06:55:01

标签: 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 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);
    }
  }
}

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

1 个答案:

答案 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.