标题比较冗长,可能会造成混淆,但是我不确定如何使标题变得更好...我希望能够访问数组列表中的值并打印出来。

我有一个名为ThingBagInterface的接口。 ThingBagInterface仅具有一种方法,如下所示:

interface ThingBagInterface {
    public String getType();
}


我现在有一个名为ThingBag的类,它是一个可以容纳一堆不同东西的包,例如生物,建筑物等。

在ThingBag类中,我像这样初始化了所有的Creatures:

public void initCreatures(){
     waterSnake = new Creature("Water Snake", Terrain.SWAMP, false, false, false, false, 1, 0);
    etc...
}


然后我有一个函数populateBag()如下所示:

public void populateBag(){
    initCreatures();

    bag.add(bears);
}


我的数组列表定义在ThingBag中,如下所示:

ArrayList<ThingBagInterface> bag = new ArrayList<ThingBagInterface>();


我的Creature构造函数如下所示:

    public Creature(String n, Terrain startTerrain, boolean flying, boolean magic, boolean charge, boolean ranged, int combat, int o){
        name = n;
        flyingCreature = flying;
        magicCreature = magic;
        canCharge = charge;
        rangedCombat = ranged;
        combatValue = combat;
        owned = o;
    }


我想打印出熊的名字。

所以我主要是这样做的:

ThingBag tb = new ThingBag();
tb.populateBag();
for(int i= 0; i<tb.bag.size(); i++){
    System.out.println(i+". "+tb.bag.get(i));
}


为什么我无法访问包中的名称?如果我不使用界面,我可以说:

System.out.println(i+". "+tb.bag.get(i).name)


但是我现在不能。关于如何获得该价值的任何想法?我现在只能访问内存地址...

最佳答案

您的bag变量声明为

ArrayList<ThingBagInterface> bag ...


从概念上讲,这意味着它至少包含ThingBagInterface个对象。它可以包含任何类型的ThingBagInterface,但至少必须是ThingBagInterface

这也意味着编译器只能保证它包含ThingBagInterface,因此您只能将其元素作为ThingBagInterface实例进行交互。

name不是在ThingBagInterface类型上存在的字段,在Creature上存在。

您可以转换bag.get(i)的返回值或声明getName()ThingBagInterface方法,在子类型中实现它,然后在循环中调用它。

关于java - 如何访问数组列表中属于接口(interface)类型的数组列表中事物的“名称”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21395682/

10-14 11:54