You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环实例化EnemyShip对象报错:意外类型(需变量,现得值)

解决Java中无法给方法返回值赋值的问题

首先得搞懂你为啥会报错:Java里,方法的返回值是值(或者对象引用的副本),不是变量本身。你写getEnemyRef(i) = new EnemyShip()的时候,左边是方法返回的一个临时值,就像你试图写5 = 10一样——左边必须是一个可以被赋值的变量(也就是“左值”),而方法返回的结果是个“右值”,只能被赋值给变量,不能反过来给它赋值。而enemy1 = new EnemyShip()是直接给变量enemy1赋值,这当然合法。

接下来给你两个符合需求的解决方案,都能避免重复写new EnemyShip(),而且满足评分系统“源代码书写次数不重复”的要求:

方案1:写一个设置方法代替获取方法

把赋值逻辑抽成一个setEnemy方法,循环里只需要调用这个方法一次,完美避免重复构造代码:

EnemyShip enemy1; EnemyShip enemy2; EnemyShip enemy3;

public Game() {
    for (int i = 1; i <= 3; i++) {
        setEnemy(i, new EnemyShip()); // 只写一次构造代码
    }
}

public void setEnemy(int enemy, EnemyShip ship) {
    switch (enemy) {
        case 1: enemy1 = ship; break;
        case 2: enemy2 = ship; break;
        case 3: enemy3 = ship; break;
    }
}

这个方案把变量赋值的逻辑封装起来,循环里的代码非常简洁,而且new EnemyShip()只在源代码里出现一次,完全符合你的需求。

方案2:循环内结合switch直接赋值

如果不想额外写方法,也可以在循环里用switch直接给对应变量赋值,同样保证构造代码只写一次:

EnemyShip enemy1; EnemyShip enemy2; EnemyShip enemy3;

public Game() {
    for (int i = 1; i <= 3; i++) {
        EnemyShip newShip = new EnemyShip(); // 只写一次构造代码
        switch(i) {
            case 1: enemy1 = newShip; break;
            case 2: enemy2 = newShip; break;
            case 3: enemy3 = newShip; break;
        }
    }
}

这个方案不需要额外方法,把构造和赋值放在循环里,同样满足评分要求。

最后再强调下:Java里永远不能给方法的返回值赋值,因为返回的是临时值,不是变量的引用本身。你原来的getEnemyRef方法只能用来读取变量的值,不能用来修改变量。

内容的提问来源于stack exchange,提问作者Harry Allen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:02:41