我是Java的新手,因此,如果这个问题太愚蠢或其他什么,我首先对不起。我有一个抽象类的ArrayList。我在列表中添加了一些对象。现在,我需要通过其属性之一找到它来删除其中之一。问题是抽象类有两个具体的类,并且它们都已添加到列表中。该属性是从抽象类继承的,因此当我进行一次foreach时,我会使用抽象类对其进行处理,但是我不知道如何告诉它需要删除的对象是这个具体的类,而不是另一个。 / p>
public void removeFruit (Integer fruitCode) {
Apple lostFruit = null;
Banana lostFruit2 =null;
for (Fruit fruit1 : fruitList) {
if (fruit1.getFruitCode().equals(fruitCode) && fruit1 == Apple) {
lostFruit = (Apple) fruit1;
fruitList.remove(lostFruit);
}else {
lostFruit2 = (Banana) fruit1;
fruitList.remove(lostFruit2);
}
}
System.out.println(fruitCode + "has been removed from the list");
}
答案 0 :(得分:2)
您需要一个Iterator
来完成此操作(for-each
循环隐藏)。正如Iterator.remove()
Javadoc指出的那样,如果在迭代进行过程中以其他方式(而不是调用此方法)修改了基础集合,则未指定迭代器的行为。
Iterator<Fruit> iter = fruitList.iterator();
while (iter.hasNext()) {
Fruit f = iter.next();
if (f.getFruitCode().equals(fruitCode)) {
if (f instanceof Apple) {
Apple a = (Apple) f;
// ...
} else if (f instanceof Banana) {
Banana b = (Banana) f;
// ...
}
iter.remove();
System.out.println(fruitCode + " has been removed from the list");
}
}
答案 1 :(得分:2)
该属性是从抽象类继承的
无需投射。处理Fruit
时,我们不在乎Apple
或Banana
。
如果抽象类具有所需的内容,则无需关心具体的子类。这就是polymorphism的意义,当更通用的类型足够时,不在乎特定类型。
public Fruit removeFruit (Integer fruitCode , List<Fruit> fruitList ) {
for (Fruit fruit : fruitList ) {
if ( fruit.getFruitCode().equals( fruitCode ) {
fruitList.remove( fruit );
return fruit ;
}
}
return null ; // In case you fruit code was not found.
}
用法示例:
List<Fruit> fruits = … ;
Integer fruitCode = … ;
Fruit fruitRemoved = this.removeFruit( fruitCode , fruits ) ;
System.out.println(
"You deleted fruit code: " + fruitCode + " of type: " + fruitRemoved.getClass().getName() ;
)
您删除了水果代码:42,类型为:Apple
在上面的示例中,我实际上将返回Optional<Fruit>
而不是Fruit
。但这是另一回事。
答案 2 :(得分:-1)
检查fruit1是否为Apple类的实例
if (fruit1 instanceof Apple) {
// your code
}