【问题标题】:Attempting to instantiate in loop, get unexpected type (expected variable)尝试在循环中实例化,得到意外类型(预期变量)
【发布时间】:2018-11-11 16:13:31
【问题描述】:

我试图在一个循环中实例化三个对象,这样我就不会重用构造函数文本。这是因为,对于 Uni,如果我们重复使用同一行代码(它会自动标记),我们就会被标记。

我的代码如下:

EnemyShip enemy1;
EnemyShip enemy2;
EnemyShip enemy3;

public Game()
{
    for (int i = 1; i <= 3; i++) {
        getEnemyRef(i) = new EnemyShip(); //getEnemyRef unexpected type - required:variable found:value
        //enemy1 = new EnemyShip(); works normally
    }
}

i 带有下划线,我被告知它是一个值而不是变量。

请注意,我使用以下代码而不是列表或数组,因为我们不允许将它们用于此任务。

public EnemyShip getEnemyRef(int enemy) {
    switch (enemy) 
    {
        case 1:
        return enemy1;

        case 2:
        return enemy2;

        case 3:
        return enemy3;
    }
    return null;
}

标记系统根据一行在源代码中的编写次数而不是执行次数来确定重复使用的次数

【问题讨论】:

  • 在赋值时需要准确的变量名。先做EnemyShip e1 = getEnemyRef(i);,再做e1 = new enemyShip()
  • 你可能想要这样的东西:EnemyShip enemy = getEnemyRef(i);
  • getEnemyRef(i) 是一个方法,因此返回一个值。您不能将某些东西赋值给一个值(因此编译器消息:required:variable found:value)。你的构造函数调用不是问题,赋值(或更准确地说:赋值的左侧)是问题。
  • 看来你需要了解数组和/或列表。
  • 我喜欢课堂教你糟糕的编码练习,以便让你使用某种方法以某种方式做某事,而实际上你永远不会那样做

标签: java loops instantiation code-reuse


【解决方案1】:

这个 sn-p 应该可以解决问题:

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

然后在for-loop:

for (int i = 1; i <= 3; i++) {
    setEnemyRef(i, new EnemyShip());
}

【讨论】:

  • 这确实有效并且符合我的要求,但遗憾的是我仍然失去了分数,因为它使用了 createNew() 方法 3 次。 (我失去了对等式检查、子/添加、构造函数使用、方法调用和类之间通信的重用(不止一种用法)的标记)
  • 创意道具,但您使用的是 OP 说不允许的数组
  • @TravisHerbert 我已经更新了,仍然不确定是否允许
【解决方案2】:

您没有正确实例化它,例如尝试

EnemyShip variableName = getEnemryRef(i); variableName = new EnemyShip();

https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

【讨论】:

  • 这段代码等同于EnemyShip variableName = new EnemyShip();(假设getEnemyRef(i) 是一种永远不会抛出的方法),我认为这不是OP 所要求的。请记住Java passes by value always,它以相同的方式按值返回。
  • 很公平,但他解决问题的方法似乎并不理想。
  • @JulianAlwandy 我现在的困境是我需要减少使用构造函数'= new EnemyShip();'这样我就不会使用三次来创建三个对象。有没有办法做到这一点?
  • @HarryAllen 不。如果你想要三个不同的对象,你至少需要三个构造函数调用。
  • @HarryAllen 您可能想要编辑您的问题并添加此信息。正确回答很关键。
猜你喜欢
  • 2014-10-16
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
相关资源
最近更新 更多