Левая часть присваивания должна быть переменной - PullRequest
2 голосов
/ 22 августа 2011

Почему это не работает?

private List<Integer> xShot = new ArrayList<Integer>();
     ...codes
     ...codes
     ...codes
     ...codes
     xShot.get(0) += 5;

Не могу понять, почему левая часть присваивания не является переменной ..

Кто-то помогает?

Ответы [ 6 ]

4 голосов
/ 22 августа 2011

Хотя xShot.get (0) - это число, оно не является переменной.Вы должны предоставить переменную, чтобы это работало.Тем не менее,

int i = xShot.get(0);
i += 5;

не будет работать.i будет увеличено на 5, но объект xShot в местоположении 5 не является тем же объектом.Вам необходимо получить, изменить и установить переменную.

Например:

xShot.set(0, xShot.get(0) + 5);
4 голосов
/ 22 августа 2011

xShot.get(0) - это вызов метода, который возвращает значение. Переменная - это то, что вы объявляете с типом, который содержит значение, например int x;, String name; или List<Integer> xShot из вашего примера. Это единственные вещи в Java, которые можно присвоить значению с помощью оператора присваивания .

2 голосов
/ 22 августа 2011

xShot.get(0) возвращает объект;это не переменная , поэтому вы не можете присвоить ей.

Кроме того, Integer является неизменным (вы не можете изменить его значение), поэтому вам придется замените объект в позиции 0 на new Integer, который имеет рассчитанное значение.

Вы можете достичь намерения этой строки следующим образом:1017 *

xShot.set(0, xShot.get(0) + 5);
1 голос
/ 22 августа 2011

Это как сказать в Java:

5 = 6; // "Assign 5 to 6"

Левая сторона (5) не является переменной.

Почему это примерное утверждение имеет значение? Из-за Java используется всегда «передача по значению». Это означает, что возвращаемое значение метода также является «возвращаемым значением». Это чисто математическое: вы не можете изменить значение, вы можете изменить переменную. То же самое для Java. Пять никогда не могут стать шестью.
Другими словами: Переменной может быть назначено только значение.

Итак, правильный способ сделать то, что вы хотите:

xShot.set(0, xShot.get(0) + 5);

Редактировать: В вашей ситуации: xShot.get(int) возвращает не переменную, а значение.

0 голосов
/ 30 августа 2011

Если вы просто хотите увеличить на 5 и конкретно не ограничены List<Integer>, вы можете избежать возможно многословного xShot.set(0, xShot.get(0) + 5) и сделать это вместо этого:

List<AtomicInteger> xShot = new ArrayList<AtomicInteger>();
xShot.get(0).addAndGet(5);

Это увеличит значениеAtomicInteger в xShot.get(0) на 5 без дальнейших церемоний.

0 голосов
/ 22 августа 2011

Левая часть присваивания должна быть явно переменной, потому что в вашем случае выражение также может быть константой, что может быть ошибкой, если разрешено

...