Java 当项目';s的数据类型是抽象的?
我是Java新手,所以首先,如果这个问题太愚蠢或是其他什么的话,我很抱歉。我有一个抽象类的数组列表。我在列表中添加了一些对象。现在我需要通过查找其中一个属性来删除其中一个。问题是抽象类有两个具体类,它们都被添加到列表中。属性是从抽象类继承的,所以当我做foreach时,我用抽象类来做,但我不知道如何告诉它需要删除的对象是这个具体类,而不是另一个Java 当项目';s的数据类型是抽象的?,java,oop,arraylist,abstract-class,Java,Oop,Arraylist,Abstract Class,我是Java新手,所以首先,如果这个问题太愚蠢或是其他什么的话,我很抱歉。我有一个抽象类的数组列表。我在列表中添加了一些对象。现在我需要通过查找其中一个属性来删除其中一个。问题是抽象类有两个具体类,它们都被添加到列表中。属性是从抽象类继承的,所以当我做foreach时,我用抽象类来做,但我不知道如何告诉它需要删除的对象是这个具体类,而不是另一个 public void removeFruit (Integer fruitCode) { Apple lostFruit = null; Ba
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");
}
检查水果1是否是类Apple的实例
if (fruit1 instanceof Apple) {
// your code
}
您需要一个
迭代器
来完成该操作(每个循环的都隐藏了该迭代器)。正如javadoc所指出的那样,如果在迭代过程中以除调用此方法之外的任何方式修改了基础集合,则迭代器的行为是未指定的
Iterator iter=fruitList.Iterator();
while(iter.hasNext()){
水果f=iter.next();
如果(f.getFrootCode().equals(FrootCode)){
if(苹果的f实例){
苹果a=(苹果)f;
// ...
}else if(香蕉的f实例){
香蕉b=(香蕉)f;
// ...
}
iter.remove();
System.out.println(从列表中删除了“水果代码+”);
}
}
无需强制转换
该属性是从抽象类继承的
不需要投。处理水果
时,我们不关心苹果
或香蕉
如果抽象类有您需要的东西,那么您就不关心具体的子类。这就是问题的关键,当更一般的类型足够时,不需要关心特定的类型
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.
}
公共水果移除水果(整数水果代码,列表水果列表){
用于(水果:水果列表){
if(fruit.getFruitCode().equals(fruitCode){
水果列表。移除(水果);
还果;
}
}
返回null;//以防找不到您的水果代码。
}
用法示例:
List<Fruit> fruits = … ;
Integer fruitCode = … ;
Fruit fruitRemoved = this.removeFruit( fruitCode , fruits ) ;
System.out.println(
"You deleted fruit code: " + fruitCode + " of type: " + fruitRemoved.getClass().getName() ;
)
列出水果=;
整数代码=;
水果移除=此.removeFruit(水果代码,水果);
System.out.println(
您删除了类型为“+FrootRemoved.getClass().getName()的水果代码“+FrootCode+”;
)
您删除了苹果类型的水果代码:42
在上面的例子中,我实际上会返回而不是水果
。但这是一个完全不同的讨论。当您要查找的属性是抽象类型时,为什么需要知道它是什么具体类型?while是否会一直运行,直到它完成整个列表,即使它可能已经完成了它的本意是什么(删除对象)?或者它会在找到对象并删除它后停止吗?@Nyom它会继续运行。你没有说fruitCode
是唯一的。如果它在一次匹配后停止,请添加一个break
。很抱歉。在这种情况下,break将进入if子句或在iter之后。remove()?(我不太使用while语句,因此在这种情况下我不确定应该在哪里打破它)在iter之后。在fruitCode
上的if
中删除。另外,如果你没有用a
或b
做任何其他事情,你可以删除这些强制转换。你一开始就不清楚为什么需要它们。我被告知,由于foreach是用抽象类运行的,所以强制转换在需要的地方ss但我的结果需要是一个具体的类这是我最初的解决方案,但由于某些原因,它不起作用,所以我尝试了另一种方法(我在这里介绍的方法,我无法让它运行).我会看看我的代码中是否有任何其他错误阻止了它的工作,尽管所有其他的事情都像他们应该做的那样
List<Fruit> fruits = … ;
Integer fruitCode = … ;
Fruit fruitRemoved = this.removeFruit( fruitCode , fruits ) ;
System.out.println(
"You deleted fruit code: " + fruitCode + " of type: " + fruitRemoved.getClass().getName() ;
)