Почему разница в объявлении общих списков? - PullRequest
15 голосов
/ 30 марта 2012

Я хочу разделить два списка: Первый - это список целых чисел.Я называю это следующим образом:

  List<Integer> ints= Arrays.asList(1,2,3);

Работает нормально.

Второй список объектов.Я объявляю это как:

  List<Object> objs= Arrays.asList(1,2.13,"three");

Но это дает ошибку в затмении, как только я пишу это.Ошибка:

  Multiple markers at this line
- Type mismatch: cannot convert from List<Object&Comparable<?>&Serializable> to 
 List<Object>
- Type safety: A generic array of Object&Comparable<?>&Serializable is created for
       a varargs parameter

Вместо этого, если я пишу

  List<Object> objs = Arrays.<Object>asList(1,2.13,"three");

Он работает нормально.

Я не могу выяснить причину.

Ответы [ 2 ]

14 голосов
/ 30 марта 2012

Посмотрите на этот пост на stackoverflow .

15.12.2.7. Вывод аргументов типа на основе фактических аргументов

Ограничение супертипаT:> X подразумевает, что решение является одним из супертипов X. Учитывая несколько таких ограничений на T, мы можем пересекать множества супертипов, подразумеваемых каждым из ограничений, так как параметр типа должен быть членом всех из них.Затем мы можем выбрать наиболее конкретный тип, который находится на пересечении

Наиболее ограничительный тип пересечения между String, Double и Integer - это оба интерфейса Comparable и Serializable,Поэтому, когда вы пишете

Arrays.asList(1,2.13,"three"); 

Это означает, что T будет implements Comparable<?>, Serializable. Тогда это как если бы вы делали

List<Object> objs = new List<T extends Comparable<?>, Serializable>

Очевидно, что это не разрешено.
С другой стороны, когда вы указываете Object, явно используя

Arrays.<Object>asList(1,2.13,"three");

, не делается никаких выводов

2 голосов
/ 30 марта 2012

Используйте это прекрасно работает

List<? extends Object> objs = Arrays.asList(10,20.32,"test");

System.out.println(objs);

Выход: [10, 20,32, тест]

...