Почему я не могу создать карту String и общий объект

Я пытаюсь сделать что-то вроде этого

  final Map<String, ? extends Object> params = new HashMap<String, ? extends Object>();

но java-компилятор, жалующийся на то, что "не может создать экземпляр типа HashMap();

Что с ним долгое время??

Ответ 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 по дженерикам, особенно. эта страница и следующая за ней.

Ответ 2

? extends Object

не оценивает ни один тип. поэтому вы не можете так упомянуть. 1. Если вы хотите, чтобы AnyType расширяет Object, тогда почему бы вам просто не передать объект. поскольку anyType, который расширяет Object, также является объектом. и по умолчанию каждый класс Java Type расширяет Object. 2. Если вы хотите, чтобы TypeA расширяет TypeB, то вы можете сделать как

Map<String, TypeB>