一个赋值语句的左侧必须是一个变量。

3
为什么这个不起作用?
private List<Integer> xShot = new ArrayList<Integer>();
     ...codes
     ...codes
     ...codes
     ...codes
     xShot.get(0) += 5;

不明白为什么赋值语句左边的´isn't´不是一个变量。

有人能帮忙吗?


1
你正在从列表中取第一个元素,然后将其与5相加,并将结果放入空白处(实际上是放入这个特定的整数)- 这就是问题所在。 这就像你写了 5 += 5。 左边的5不是一个变量。 - om-nom-nom
6个回答

5

xShot.get(0) 是一个返回值的方法调用。变量是您声明的具有保存值的类型的东西,例如 int x;String name; 或者您示例中的 List<Integer> xShot。这些是 Java 中唯一可以使用赋值运算符分配值的东西。


5
尽管xShot.get(0)是一个数字,但它不是一个变量。您需要提供一个变量才能使其工作。话虽如此,
int i = xShot.get(0);
i += 5;

无法正常工作。 i 将增加 5,但是位置 5 上的 xShot 对象不是同一个对象。您需要获取、修改和设置变量。

例如:

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

2
xShot.get(0)返回一个对象,它不是一个变量,因此你不能对它进行赋值。
此外,Integer是不可变的(你无法更改它的值),所以你必须用一个新的Integer替换在位置0的对象,该对象具有计算出的值。
你可以通过以下方式实现该行的意图:
xShot.set(0, xShot.get(0) + 5);

1

这就像在Java中说:

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

左边的值(5)是不可变的。

为什么这个例子语句很重要?因为Java总是使用“传值调用”。这意味着方法的返回值也是“按值返回”的。 这是纯数学:你不能改变一个值,你可以改变一个变量。Java也是一样的。五永远不可能变成六。
换句话说:只有一个值可以赋给一个变量。

所以,做你想做的事情的正确方式是:

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

编辑:在你的情况下:xShot.get(int) 不会返回一个变量,而是一个值。


0

如果你只想增加5,而不是仅限于 List<Integer>,那么你可以避免使用可能有点啰嗦的 xShot.set(0, xShot.get(0) + 5),而改为这样:

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

这将直接在原地将 xShot.get(0) 中的 AtomicInteger 值增加 5,无需其他操作。


0

赋值语句的左侧必须明确为变量,因为在您的语句中,表达式也可能是一个常量,如果允许这种情况会导致错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接