Я много читал об этом, и я знаю, что:разница между списком и списком <?>
List<Object> listOfObject = new ArrayList<TYPE>(); // (0)
//can only work for TYPE == Object.
//if TYPE extends Object (and thus objects of type TYPE are Objects),
//this is not the same with Lists: List<Type> is not a List<Object>
Теперь я прочитал, что следующее нормально:
List undefinedList = new ArrayList<TYPE>(); // (1)
//works for ANY type (except for primitives)
И
List<?> wildcardList = new ArrayList<TYPE>(); // (2)
//also works for ANY type (except for primitives)
Тогда:
List undefinedlist = new ArrayList(); //no TYPE specified
undefinedList.add(new Integer(1)); //WORKS
undefinedList.add(new String("string")); //WORKS
Однако:
List<?> wildcardList = new ArrayList<TYPE>(); //TYPE specified
wildcardList.add(new TYPE(...)); //COMPILER ERROR
пример:
List<?> wildcardList = new ArrayList<String>(); //TYPE specified
wildcardList.add(new String("string")); //COMPILER ERROR: The method add(capture#1-of ?) in the type List<capture#1-of ?> is not applicable for the arguments (String)
Я понимаю, почему вы ничего не можете добавить к wildcardList, так как ее тип может быть что угодно. Однако почему вы можете добавить к undefinedList? Они кажутся одинаковыми & показывают одинаковое поведение, данное (1) и (2).
Как с почти ЛЮБОЙ вопрос. Всегда лучше показать, что такое «ошибка компилятора» (текст ошибки). – billjamesdev
'?' Не означает * ничего *, но ** неизвестен **. – m0skit0
Возможный дубликат [java generics unbound wildcard vs raw type] (http: // stackoverflow.com/questions/14242174/java-generics-unbound-wildcard-vs-raw-type) –