Преобразование ArrayList объектов в ArrayList родительских объектов - PullRequest
0 голосов
/ 09 июля 2020

У меня есть файлы Card. java и Util. java, которые мне не разрешено изменять. Для своих целей я создал класс Card2, который расширяет Card и добавляет метод equals() и метод hashcode(). Класс Util содержит метод, который принимает ArrayList<Card> в качестве параметра. У меня есть ArrayList<Card2>, и я хочу запустить этот метод.

Насколько я понимаю, в этом случае Card2 имеет отношение "is-a" с Card, поэтому я думаю, что там должен быть способ преобразовать ArrayList<Card2> в ArrayList<Card>.

Я не уверен, как go выполнить это преобразование. Я пробовал (ArrayList<Card>) arr, где arr - это ArrayList<Card2>, но получаю сообщение об ошибке, что это неконвертируемые типы. Я понимаю, что могу создать новый ArrayList<Card> и добавить каждую из карт в arr независимо, но мне интересно, есть ли лучший способ go по этому поводу.

Ответы [ 3 ]

2 голосов
/ 09 июля 2020

Учитывая список Card2:

ArrayList<Card2> card2s;

Сделайте это:

ArrayList<Card> cards = new ArrayList<>(card2s);

Конструктор принимает Collection<? extends Card>, который на английском языке sh является Коллекцией всего, что является или расширяет Card.

1 голос
/ 09 июля 2020

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

https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

"Существует небольшое, но очень важное отличие: мы заменили тип List на List . Теперь drawAll () будет принимать списки любого подкласса Shape, поэтому теперь мы можем вызывать его в List, если хотим "

Если у вас нет доступа к этому методу, вы все равно можете приводить элементы внутри списка. . Пример из Java stream api:

Можно ли преобразовать поток в Java 8?

1 голос
/ 09 июля 2020
    ArrayList<Card2> card2s = new ArrayList<>();

    ArrayList<Card> cards = (ArrayList<Card>)card2s.stream().map(card2 -> {
        Card card = new Card();
        //your logic to take data from card2 variable and set it to the new Card2 object:
        //e.g. card.setType(card2.getType());
        return card;
    }).collect(Collectors.toList());
...