#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 ); Итак, это просто проблема «использования», а не проблема метода?