Почему разница в объявлении общих списков?

Я хочу разделить два списка: Во-первых, это список целых чисел. Я рассматриваю это как:

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

Он отлично работает.

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

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

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

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

Он отлично работает.

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

Ответы

Ответ 1

Посмотрите fooobar.com/questions/346752/....

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

Использовать это идеально подходит

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

System.out.println(objs);

Выход: [10, 20.32, test]