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