如何引用它所扩展的类所引用的对象的[非抽象]字段?

时间:2011-12-29 21:45:27

标签: java oop abstract

也就是说,我有一个类'Entity'的列表,它是一个包含几个不同类的抽象类。 在列表中,我可以使用

确定哪些属于特定的后代类
if (list[i] instanceof Enemy)

但是,我不能使用list[i]引用引用特定于Enemy且未继承的字段。

有没有简单的方法来获取它的引用,这将让我引用特定的字段?

否则我只会重写代码的结构。

解决:明确施放:

(Enemy)(list[i])

5 个答案:

答案 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)

如果someMethodEnemy类中的方法,

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