【问题标题】:Compilation error with assignment expression赋值表达式的编译错误
【发布时间】:2026-02-04 13:25:01
【问题描述】:

如何切换数组列表中的每两项?

例如: “hi”、“how”、“are”、“you”变成:

“如何”、“嗨”、“你”、“是”

这是我的错误(在实践中):

编译器在这里发现了它不期望的数据类型。有时在比较值时将 = 误认为 == 会出现此错误

意外的类型
必需:变量
找到:值
list.get(i) = list.get(i+1);

意外的类型
必需:变量
找到:值
list.get(i+1) = temp;

这就是我所拥有的:

    public void switchPairs(ArrayList<String> list){
        String temp = "";
        for(int i = 0; i<= list.size(); i+2){
            temp = list.get(i);
            list.get(i) = list.get(i+1);
            list.get(i+1) = temp;
        }
    }

【问题讨论】:

  • 你觉得list.get(i) = ...应该怎么做?你为什么这么认为?

标签: java variable-assignment


【解决方案1】:

您正试图将get 方法的返回值用作变量。与数组访问表达式不同,例如arr[i] = value,这是合法的,方法调用的结果不能这样使用。您必须改用set method

temp = list.get(i);
list.set(i, list.get(i + 1));
list.set(i + 1, temp);

这将修复编译器错误,但运行它会保证IndexOutOfBoundsException

如果列表大小是偶数,则list.get(i) 将在i 达到list.size() 时抛出IndexOutOfBoundsException。请记住,有效索引是从0size() - 1

如果列表大小为奇数,则list.get(i + 1) 将抛出IndexOutOfBoundsException

您必须更改您的 for 循环条件以在 i 之前停止 并且 i + 1 超出范围。 (这里的增量需要+=才有效果。)

for(int i = 0; i < list.size() - 1; i+=2){

这将使奇数大小的列表中的最后一项保持不变。

【讨论】:

    【解决方案2】:

    因为每个方法都返回一个value,而不是variable

    并且赋值运算符的左操作数必须是变量,否则会发生编译时错误。

    你可以这样想: 如果我们可以通过它的 getter 来修改变量,那么 封装 是无稽之谈,因为通常有一个私有属性的 getter。

    总而言之,在这种情况下(以及许多其他情况),您应该使用 setter 来获得金牌。像这样:

    list.set(i, "something you want");
    

    【讨论】: