2015-11-06 3 views
1

У меня есть ArrayList, содержащий объекты, полученные из абстрактного класса, есть способ вернуть список массивов абстрактного типа класса, затем, используя полиморфизм, иметь возможность ссылаться объект происхождения?Java ArrayList, метод доступа для возврата ArrayList абстрактного класса

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

+2

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

ответ

2

Предположим, что ваш конкретный класс Integer и ваш абстрактный класс, Number.

Если вы готовы получить результат ввергнуть как List<Number> вместо ArrayList<Number> (хорошая практика в любом случае), вы можете сделать что-то вроде следующего:

List<Integer> listOfConcrete = new ArrayList<>(); // your actual list 
List<Number> listOfAbstract = listOfConcrete.stream() 
    .map(n -> (Number) n) 
    .collect(Collectors.toList()); 

Вам необходимо явное приведение в map() вызовите так, чтобы кастинг выполнялся должным образом.

+0

Вау, это было быстро, я использовал ваш пример, и он отлично работает, мой метод выглядит так: public ArrayList alobjGetPollSchedule() {retrurn (ArrayList ) malobjPollSchedule.stream(). Map (n -> (clsPoll) n) .collect (Collectors.toList()); } – SPlatten

+1

Нет, вам не нужен явный приведение в 'map'. На самом деле вам совсем не нужен шаг «map». 'listOfAbstract = listOfConcrete.stream(). collect (Collectors.toList());' достаточно. Но вам даже не нужна Java 8 для копирования списка: 'List listOfAbstract = new ArrayList <> (listOfConcrete);' работает также. – Holger

+0

И если цель состоит в том, чтобы использовать List в качестве чисел, возможно, все нужно, это 'List listOfAbstract = listOfConcrete; ', который не нуждается в какой-либо копии. Но ОП должен действительно разъяснять, чтобы мы знали. –