Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何引用由类it';引用的对象的[non-abstract]字段;什么在延伸?_Java_Oop_Abstract - Fatal编程技术网

Java 如何引用由类it';引用的对象的[non-abstract]字段;什么在延伸?

Java 如何引用由类it';引用的对象的[non-abstract]字段;什么在延伸?,java,oop,abstract,Java,Oop,Abstract,也就是说,我有一个类“Entity”的列表,它是一个包含几个不同类的抽象类。 在列表中,我可以使用 if (list[i] instanceof Enemy) 您必须手动将对象投射到敌人的: ((Enemy)(list[i])).enemyField 你也许可以省去一些我从来都不确定的妄想症 另外请注意,如果你做了大量的铸造,这可能是一个迹象,你的设计可能需要一些改进。强制转换不允许您利用编译器的类型安全功能。。。您可以通过在实体类中抽象声明的方法隐藏对这些字段的访问吗?您必须手动将对象强制转

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

if (list[i] instanceof Enemy)

您必须手动将对象投射到敌人的

((Enemy)(list[i])).enemyField
你也许可以省去一些我从来都不确定的妄想症


另外请注意,如果你做了大量的铸造,这可能是一个迹象,你的设计可能需要一些改进。强制转换不允许您利用编译器的类型安全功能。。。您可以通过在
实体
类中抽象声明的方法隐藏对这些字段的访问吗?

您必须手动将对象强制转换为
敌人

((Enemy)(list[i])).enemyField
你也许可以省去一些我从来都不确定的妄想症


另外请注意,如果你做了大量的铸造,这可能是一个迹象,你的设计可能需要一些改进。强制转换不允许您利用编译器的类型安全功能。。。可以通过在
实体
类中抽象声明的方法隐藏对这些字段的访问吗?

可以将元素强制转换为适当的类

Enemy enemy = (Enemy)element; 
int hitPoints = enemy.getHitPoints(); 

但是,在处理基类型的混合集合时,通常是因为您只对多态行为感兴趣,所以我鼓励您至少继续探索代码的特定区域。(注意,通常也不鼓励直接访问成员字段或变量,因为这违反了封装。)

您可以将元素强制转换为适当的类

Enemy enemy = (Enemy)element; 
int hitPoints = enemy.getHitPoints(); 

但是,在处理基类型的混合集合时,通常是因为您只对多态行为感兴趣,所以我鼓励您至少继续探索代码的特定区域。(注意,通常也不鼓励直接访问成员字段或变量,因为这违反了封装。)

如果
someMethod
类中的方法

if( list[i] instanceof Enemy ){
  ((Enemy) list[i] ).someMethod();
}

如果
someMethod
敌方
类中的方法

if( list[i] instanceof Enemy ){
  ((Enemy) list[i] ).someMethod();
}

如果列表中存储的对象是敌方的实例,您将进入If语句,您应该能够安全地将其转换为:
(敌方)列表[i]

如果列表中存储的对象是敌方的实例,您将进入If语句,您应该能够安全地将其转换为:
(敌人)列表[i]

正确的方法是使用泛型:

List<Enemy> enemies = new ArrayList<Enemy>();
...
enemies.add(new EnemySubClass()); // etc
...
for (Enemy enemy : enemies) {
    enemy.someEnemyMethod();
}
List=new ArrayList();
...
添加(新EneySubclass());//等
...
为(敌人:敌人){
敌人。某物我的方法();
}
正确的方法是使用泛型:

List<Enemy> enemies = new ArrayList<Enemy>();
...
enemies.add(new EnemySubClass()); // etc
...
for (Enemy enemy : enemies) {
    enemy.someEnemyMethod();
}
List=new ArrayList();
...
添加(新EneySubclass());//等
...
为(敌人:敌人){
敌人。某物我的方法();
}

首先,您可以使用Java中的List.get(i)从列表中删除一个项目。第二,你的问题不是很正式。你能发布代码并让我们知道你是如何填充该列表的吗?首先,您可以使用Java中的List.get(i)从列表中删除一项。第二,你的问题不是很正式。你能发布代码并让我们知道你是如何填充该列表的吗?谢谢