Как написать общий метод Java с E … элементами и возвращаемым списком

#java #generics

#java #общие сведения

Вопрос:

Я хочу написать метод следующим образом

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

Как я могу решить эту проблему?
Спасибо!

Комментарии:

1.Похоже, это очень похоже на существующую утилиту в guava. docs.guava-libraries.googlecode.com/git-history/v17.0/javadoc/…Если вам просто нужен список, он также очень похож на Arrays.asList docs.oracle.com/javase/7/docs/api/java/util /…

2. Всегда указывайте ошибку компиляции, если ваш вопрос касается ошибки компиляции.

Ответ №1:

Если я вас понимаю, то вы можете сделать это с помощью подстановочного знака (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. newList компилируется нормально … при статическом импорте Collections.addAll .

2. Вам нужно обработать elements значение null. В настоящее время это приведет к исключению NullPointerException .

3. List<Class<?>> c = ListUtils.<Class<?>>newList(String.class, Long.class); было бы предпочтительнее, если бы вы хотели добавить дополнительные (ненулевые) элементы в список.

4. Отредактировано @PaulBellora. Спасибо!

Ответ №2:

Похоже, вы запутались в части вывода типа. Он привязывает остальные ваши элементы к типу Class extends Comparable amp; Serializable (из-за ошибки компилятора).

Вы можете исправить это, добавив в свой общий список предложение с подстановочным знаком extends; вас действительно волнуют только те элементы, которые действительно могут быть назначены как Class .

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

Комментарии:

1. Спасибо! Я также нахожу, что это утверждение может быть скомпилировано: List<Class<?>> b = ListUtils . <Класс<?>>Новый список (String.class ,Long.class ); Итак, это просто проблема «использования», а не проблема метода?