标题很冗长,可能令人困惑,但我不确定如何让它变得更好......我希望能够访问数组列表中的值并打印出来。
我有一个名为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)
但我现在不能。关于如何获取该值的任何想法?我现在只能访问内存地址......
答案 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。
我希望这会有所帮助。