也就是说,我有一个类'Entity
'的列表,它是一个包含几个不同类的抽象类。
在列表中,我可以使用
if (list[i] instanceof Enemy)
但是,我不能使用list[i]
引用引用特定于Enemy
且未继承的字段。
有没有简单的方法来获取它的引用,这将让我引用特定的字段?
否则我只会重写代码的结构。
解决:明确施放:
(Enemy)(list[i])
答案 0 :(得分:3)
您必须手动将对象转换为Enemy
:
((Enemy)(list[i])).enemyField
你可能会遗漏一些我从未确定过的那种痛苦。
另请注意,如果您正在进行大量演员,则可能表明您的设计可能需要一些改进。 Casting不允许您利用编译器的类型安全功能...您可以通过在Entity
类中抽象声明的方法隐藏对这些字段的访问吗?
答案 1 :(得分:1)
您可以将元素强制转换为适当的类。
Enemy enemy = (Enemy)element;
int hitPoints = enemy.getHitPoints();
但是,在使用基类型的混合集合时,通常是因为您只对多态行为感兴趣,因此我建议您至少要探索代码的特定区域。 (在这方面,通常也不鼓励直接访问成员字段或变量,因为你的问题意味着你希望这样做,因为这违反了封装。)
答案 2 :(得分:1)
如果列表中存储的对象是Enemy的实例,您将进入if语句,并且应该能够安全地转换为:
(Enemy) list[i]
答案 3 :(得分:0)
如果someMethod
是Enemy
类中的方法,
if( list[i] instanceof Enemy ){
((Enemy) list[i] ).someMethod();
}
答案 4 :(得分:0)
“正确”的方法是使用泛型:
List<Enemy> enemies = new ArrayList<Enemy>();
...
enemies.add(new EnemySubClass()); // etc
...
for (Enemy enemy : enemies) {
enemy.someEnemyMethod();
}