如何用E ...元素编写Java泛型方法并返回List <e> </e>

时间:2014-06-26 01:18:53

标签: java generics

我想写一个方法如下

public static <E> ArrayList<E> newList(E... elements){
    ArrayList<E> list = new ArrayList<E>(elements.length);
    addAll(list,elements);
    return list;
}

当我像这样使用它时它会起作用

List<String> a = ListUtils.newList("a","b");

但在这种情况下无法编译

List<Class> c = ListUtils.newList(String.class,Long.class);

我该如何解决这个问题? 谢谢!

2 个答案:

答案 0 :(得分:2)

如果我了解你,那么你可以使用通配符(jls-4.5.1)这样做,

public static void main(String[] vargs) {
  List<Class<?>> c = ListUtils.<Class<?>>newList(String.class,Long.class);
}

此外,您发布时newList无法编译。我认为应该是这样的,

public static <E> List<E> newList(E... elements) {
  List<E> list = new ArrayList<E>((elements != null) ? elements.length : 0);
  for (E elem : elements) {
    list.add(elem);
  }
  return list;
}

答案 1 :(得分:1)

好像你在类型推理片上被绊倒了。它将其余元素绑定到Class extends Comparable & Serializable类型(来自编译器错误)。

您可以通过在通用列表中添加wildcard-extends子句来解决此问题;您只关心实际可以指定为Class的元素。

List<? extends Class> c = ListUtils.newList(String.class,Long.class);