如何访问我的数组列表中的东西的“名称”,这是我的接口类型的数组列表?

时间:2014-01-28 02:23:40

标签: java arraylist interface

标题很冗长,可能令人困惑,但我不确定如何让它变得更好......我希望能够访问数组列表中的值并打印出来。

我有一个名为ThingBagInterface的界面。这个ThingBagInterface只有一个方法,如下所示:

interface ThingBagInterface {
    public String getType();
}

我现在有一个名为ThingBag的课程,它是一个包含许多不同东西的包,例如生物,建筑物等。

在我的ThingBag课程中,我已经初始化了我的所有生物:

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>();

我的生物构造函数如下所示:

    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) 

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

3 个答案:

答案 0 :(得分:2)

您的bag变量声明为

ArrayList<ThingBagInterface> bag ...

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

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

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

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

答案 1 :(得分:2)

您需要更明智地设计ThingBagInterface界面。有名字是一个要求吗?如果是这样,接口需要一种方法来访问对象的名称。 (这需要是一种方法,因为接口不能指定字段。)虽然我们正在使用它,但选择比ThingBagInterface更具信息性的名称将是一个好主意。

答案 2 :(得分:1)

也许像System.out.println(i+". "+(((Creature)tb.bag.)get(i));

这样的演员

这是因为界面没有name属性。请记住,接口中的字段始终是隐式的public static和final。

我希望这会有所帮助。