Почему последняя строка следующего кода не компилируется в Java?Назначение для возврата значения HashMap get
HashMap<String, Integer> map = new HashMap();
map.put("a", 1);
map.get("a") += 1;
Что-то вроде этого отлично подходит для C++.
Почему последняя строка следующего кода не компилируется в Java?Назначение для возврата значения HashMap get
HashMap<String, Integer> map = new HashMap();
map.put("a", 1);
map.get("a") += 1;
Что-то вроде этого отлично подходит для C++.
Вы пытаетесь изменить значение карты с помощью метода get. В вашем коде будет только RETURN a Целое. Вы не можете изменить значение Integer, хранящееся внутри объекта HashMap без использования метода сеттера .put()
Что-то, как это приемлемо:
map.put("a",1);
map.put("a",map.get("a") + 1);
Однако это:
map.get("a") += 1;
не является приемлемым и не будет compile, потому что вы не можете изменить значение объекта методом геттера.
Причина методы получения и установки, как map.put()
& map.get()
, настолько важны в Java можно найти here
Что вы получаете в результате из map.get
является Integer
объектом. И те объекты Integer
не поддерживают оператор + = (как вы знаете, из C++), так как вы не можете перегружать операторов в Java вообще. Вместо этого вы должны снова поместить его в карту, используя функцию map.put
. Обратите внимание, что объект Integer
отличается от встроенного int
!
Фактически, это действительно работает и делает то, что вы ожидали бы этого. – Tunaki
Ваш код, который «не работает» действительно работает, из-за autounboxing и autoboxing. Проблема здесь не связана с целыми операциями - вы не можете назначить возвращаемое значение метода. –
Да, вы двое правы. У меня все еще были некоторые другие флаги компилятора, которые предотвратили автобоксинг. Извини за это... – sleepy42
Что-то вроде этого отлично подходит для C++.
Java не является C++, поэтому вы не должны ожидать, что что-то действительное в C++ одинаково справедливо в Java.
Если вы хотите обновить значение, хранящееся под определенным ключом на карте, вам придется снова поместить его на карту с новым значением, которое заменит старое значение. Например:
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
// Get the value stored under "a", add one and store the new value
map.put("a", map.get("a") + 1);
Я понимаю, что могу изменить значение на карте по указанному вами методу. Но мне было интересно, что ограничение языка Java фактически запрещает такие выражения. Я думаю, что ответ заключается в том, что 'map.get()' возвращает 'Integer', который является неизменным. – hovo
Ограничение указано выше. Вы не можете изменить значение с помощью метода геттера. Единственный способ фактически изменить значение на карте - использовать метод setter, потому что вы можете получить доступ только к объекту Integer, хранящемуся на карте, по предопределенным методам. Компилятор java предполагает, что вы пытаетесь изменить значение объекта Integer и сохранить это новое значение внутри карты, используя тот же оператор map.get, поэтому вы получаете ошибку компилятора – Turtle