标题比较冗长,可能会造成混淆,但是我不确定如何使标题变得更好...我希望能够访问数组列表中的值并打印出来。
我有一个名为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/