Я пытаюсь сделать что-то вроде этого
final Map<String, ? extends Object> params = new HashMap<String, ? extends Object>();
но java-компилятор, жалующийся на то, что "не может создать экземпляр типа HashMap();
Что с ним долгое время??
Я пытаюсь сделать что-то вроде этого
final Map<String, ? extends Object> params = new HashMap<String, ? extends Object>();
но java-компилятор, жалующийся на то, что "не может создать экземпляр типа HashMap();
Что с ним долгое время??
? 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 по дженерикам, особенно. эта страница и следующая за ней.
? extends Object
не оценивает ни один тип. поэтому вы не можете так упомянуть. 1. Если вы хотите, чтобы AnyType расширяет Object, тогда почему бы вам просто не передать объект. поскольку anyType, который расширяет Object, также является объектом. и по умолчанию каждый класс Java Type расширяет Object. 2. Если вы хотите, чтобы TypeA расширяет TypeB, то вы можете сделать как
Map<String, TypeB>