почему я не могу создать карту строки и общий объект - PullRequest
11 голосов
/ 05 августа 2011

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

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

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

, что с ним случилось??

Ответы [ 2 ]

16 голосов
/ 05 августа 2011

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

0 голосов
/ 05 августа 2011
? extends Object

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

Map<String, TypeB>
...