Как я могу удалить элемент из ArrayList, когда его тип данных абстрактный? - PullRequest
0 голосов
/ 21 сентября 2018

Я новичок в Java, поэтому прежде всего извините, если этот вопрос слишком глуп или что-то в этом роде.У меня есть ArrayList абстрактного класса.Я добавил несколько объектов в список.Теперь мне нужно удалить один из них, найдя его по одному из его атрибутов.Дело в том, что у абстрактного класса есть два конкретных класса, и оба они были добавлены в список.Атрибут наследуется от абстрактного класса, поэтому, когда я выполняю 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");

}

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Вам нужно 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");
    }
}
0 голосов
/ 21 сентября 2018

Нет необходимости кастовать

Атрибут наследуется от абстрактного класса

Нет необходимости кастовать.При работе с Fruit мы не заботимся о Apple или Banana.

Если у абстрактного класса есть то, что вам нужно, вам наплевать на конкретный подкласс.В этом смысл полиморфизма , не заботящегося о конкретных типах, когда достаточно более общего типа.

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.Но это совсем другое обсуждение.

0 голосов
/ 21 сентября 2018

Проверьте, является ли fruit1 экземпляром класса Apple

if (fruit1 instanceof Apple) {
// your code
}
...