Насколько я знаю, ограниченные широкие карты , т.е. ? extends Number
, не используются для переменных или полей. Обычно используется для аргументов метода.
Давайте сначала рассмотрим случай без универсального типа.
public void method(List<Number> list) {
}
Пример использования:
method(new List<Double>()); // <-- Java compiler complains about this
method(new List<Number>()); // <-- Java compiler is happy with this.
В этот метод можно передать только List
из Number
, но не List
из Double
, даже если Double
является подклассом Number
.
Универсальный широкоформатный код может использоваться здесь, чтобы сообщить компилятору java, что этот метод может принимать любой список подкласса Number
.
public void method(List<? extends Number> list) {
}
Примеры использования:
method(new List<Double>()); // <-- Java compiler is happy with this.
method(new List<Number>()); // <-- Java compiler is happy with this.
Однако вы больше не сможете изменять объект списка, например,
public void method(List<? extends Number> list) {
list.add(new Double()); // this is not allowed
}
В приведенном выше списке теперь есть тип «неизвестный подтип Number
», который может быть списком, списком, списком и т. Д. Добавление объекта Double
в список неизвестного типа, безусловно, небезопасно. Чтобы проиллюстрировать этот момент, вызов method
является
method(new ArrayList<Integer>());
...
public void method(List<? extends Number> list) {
// adding Double to Integer list does not make sense.
list.add(new Double()); // compiler error
}
Для переменных и полей обычно вы не используете ограниченные широкие карты, вы можете сделать
private Map<String, Object> origValueMap;
...
Map<String, Object> valueMapPart1 = origValueMap;
valueMapPart1.put(nameMappings[3], new Double(splitAtQuantity));
Примечание: нет необходимости приводить new Double(splitAtQuantity)
к его супер типу, например Number
или Object
.