多种类型的自定义arraylist

时间:2015-07-12 00:49:18

标签: java class oop arraylist casting

我目前正在尝试制作一款简单的RPG-ish游戏。我希望怪物在地图上随机生成。我已将其设置为当我想要生成它时,它会被添加到名为ArrayList的{​​{1}}中。我完成时会有许多不同类型的monsters,每个人都有自己的类(例如Zombie,Ghost ......),每个类都有一个绘制怪物的方法,称为绘制。我想知道如何做到这一点。

monstersMonsters所以它可以包含不同的类,但它不会让我做ArrayList<Object>;这实际上是可能的,还是我是愚蠢的。

3 个答案:

答案 0 :(得分:3)

您未能将对象ArrayList<Object>强制转换回Monster

// Monster.get(i)            == Object
// (Monster) Monsters.get(i) == Monster

// cast the list item i from Object to Monster
((Monster) Monsters.get(i)).draw();

更好的解决方案:

interface Monster {
   void draw();
}

// implement draw on each
class Zombie implements Monster {}
class Ghost implements Monster {}

ArrayList<Monster> monsters = new ArrayList<>();
// legal
monsters.add(new Zombie());
monsters.add(new Ghost());

// legal
monsters.get(i).draw();

你可以上课 - &gt;扩展解决方案或此接口 - &gt;实现。无论哪种方式,这都是实现怪物的更好方法的一个非常简单的例子。

答案 1 :(得分:3)

是的,首先您需要创建一个界面,例如包含IMonster方法的draw。然后,让每个怪物类型实现这个界面。

您的ArrayList将如下所示:

List<IMonster> monsters = new ArrayList<IMonster>();

monsters.add(new Ghost());
monsters.add(new Goblin());

所以这是一个例子:

import java.util.ArrayList;
import java.util.List;

public class Monsters {
    private static List<IMonster> monsters = new ArrayList<IMonster>();

    public static void main(String[] args) {
        monsters.add(new Ghost());
        monsters.add(new Goblin());
        monsters.add(new Devil());  

        for (IMonster monster : monsters) {
            monster.draw();
        }
    }
}

interface IMonster {
    public void draw();
}

abstract class AbstractMonster implements IMonster {
    @Override
    public void draw() {
        System.out.println("Shared drawing code for all monsters");
    } 
}

class Ghost extends AbstractMonster {
    @Override
    public void draw() {
        super.draw();
        System.out.println("Ghost drawing code");
    }
}

class Goblin extends AbstractMonster {
    @Override
    public void draw() {
        super.draw();
        System.out.println("Goblin drawing code");
    }
}

class Devil extends AbstractMonster {
    @Override
    public void draw() {
        super.draw();
        System.out.println("Devil drawing code");
    }
}

答案 2 :(得分:1)

你必须像这样 -

从ArrayList中转换你的项目
Object item = Monsters.get(i);
Monster monster = (Monster) item;
monster.draw();  

或者你可以使用一些界面。您可以使用界面(例如Drawable)。您的Monster和其他可绘制类将实现它。然后使用ArrayList的{​​{1}}。

Drawable