首页 > 解决方案 > 泛型方法的问题

问题描述

我对 Q 类的方法 idTag 有疑问。我不确定应该放什么类型而不是 XXXX。我试过 < T extends Taggable< T >> 但以下调用存在问题: Q.idTag (b) ;

它说 :

Q 类型中的方法 idTag(List) 不适用于参数 (ArrayList<RedElem>)

< T extends Taggable< T >> 似乎不是正确的答案,但我的想法已经不多了,我不知道什么是正确的,谢谢

interface Taggable<T> {

  void tag(T t);

  T getTag();
}

class Elem implements Taggable<Elem> {}

class Obj implements Taggable<Obj> {}

class RedElem extends Elem {}

class Q {

  static <XXXX> void idTag(List<T> l) {
    for (T e : l) e.tag(e);
  }

  public static void main(String args[]) {
    ArrayList<Elem> a = new ArrayList<Elem>();
    ArrayList<RedElem> b = new ArrayList<RedElem>();
    ArrayList<Obj> c = new ArrayList<Obj>();

    idTag(a);
    idTag(b);
    idTag(c);
  }
}

标签: javagenerics

解决方案


您在静态方法中要说的是列表应该包含Taggable项目,这不是您要声明的内容。你需要

static <T, E extends Taggable<T>> void idTag(List<E> tList, T tagWith) {
    tList.forEach(e.tag(tagWith));
}

或者如果你真的想用自己标记每个项目(这没有多大意义):

static <E extends Taggable<E>> void idTag(List<E> tList) {
    tList.forEach(e-> e.tag(e));
}

推荐阅读