Посмотрите на этот пост на 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");
, не делается никаких выводов