Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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 当项目';s的数据类型是抽象的?_Java_Oop_Arraylist_Abstract Class - Fatal编程技术网

Java 当项目';s的数据类型是抽象的?

Java 当项目';s的数据类型是抽象的?,java,oop,arraylist,abstract-class,Java,Oop,Arraylist,Abstract Class,我是Java新手,所以首先,如果这个问题太愚蠢或是其他什么的话,我很抱歉。我有一个抽象类的数组列表。我在列表中添加了一些对象。现在我需要通过查找其中一个属性来删除其中一个。问题是抽象类有两个具体类,它们都被添加到列表中。属性是从抽象类继承的,所以当我做foreach时,我用抽象类来做,但我不知道如何告诉它需要删除的对象是这个具体类,而不是另一个 public void removeFruit (Integer fruitCode) { Apple lostFruit = null; Ba

我是Java新手,所以首先,如果这个问题太愚蠢或是其他什么的话,我很抱歉。我有一个抽象类的数组列表。我在列表中添加了一些对象。现在我需要通过查找其中一个属性来删除其中一个。问题是抽象类有两个具体类,它们都被添加到列表中。属性是从抽象类继承的,所以当我做foreach时,我用抽象类来做,但我不知道如何告诉它需要删除的对象是这个具体类,而不是另一个

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