Ответ 1
? extends Object
является подстановочным знаком. Это означает "какой-то неизвестный тип, и единственное, что мы знаем об этом, - это подтип Object
". Это хорошо в объявлении, но вы не можете его создать, потому что это не фактический тип. Попробуйте
final Map<String, ? extends Object> params = new HashMap<String, Object>();
Поскольку вы не знаете, какой тип ?
вы не можете ему присваивать. Так как Object
является супертипом всего, params
может быть назначен как ссылка как на HashMap<String, Integer>
, так и на HashMap<String, String>
, среди многих других вещей. A String
не является Integer
и не является Integer
a String
. Компилятор не знает, что params
может быть, поэтому это не действительная операция, чтобы поместить что-либо в params
.
Если вы хотите разместить <String, String>
в params
, тогда объявите его как таковой. Например,
final Map<String, Object> params = new HashMap<String, Object>();
params.put("a", "blah");
Для хорошего введения на эту тему ознакомьтесь с учебным курсом Java Language по дженерикам, особенно. эта страница и следующая за ней.