2015-09-05 2 views

ответ

3

Вы пытаетесь изменить значение карты с помощью метода 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

+0

Я понимаю, что могу изменить значение на карте по указанному вами методу. Но мне было интересно, что ограничение языка Java фактически запрещает такие выражения. Я думаю, что ответ заключается в том, что 'map.get()' возвращает 'Integer', который является неизменным. – hovo

+0

Ограничение указано выше. Вы не можете изменить значение с помощью метода геттера. Единственный способ фактически изменить значение на карте - использовать метод setter, потому что вы можете получить доступ только к объекту Integer, хранящемуся на карте, по предопределенным методам. Компилятор java предполагает, что вы пытаетесь изменить значение объекта Integer и сохранить это новое значение внутри карты, используя тот же оператор map.get, поэтому вы получаете ошибку компилятора – Turtle

-3

Что вы получаете в результате из map.get является Integer объектом. И те объекты Integer не поддерживают оператор + = (как вы знаете, из C++), так как вы не можете перегружать операторов в Java вообще. Вместо этого вы должны снова поместить его в карту, используя функцию map.put. Обратите внимание, что объект Integer отличается от встроенного int!

+0

Фактически, это действительно работает и делает то, что вы ожидали бы этого. – Tunaki

+1

Ваш код, который «не работает» действительно работает, из-за autounboxing и autoboxing. Проблема здесь не связана с целыми операциями - вы не можете назначить возвращаемое значение метода. –

+0

Да, вы двое правы. У меня все еще были некоторые другие флаги компилятора, которые предотвратили автобоксинг. Извини за это... – sleepy42

0

Что-то вроде этого отлично подходит для 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); 
Смежные вопросы