2016-12-13 4 views
0

У меня есть два списка:Один список, несколько типов

List<Person> listOfPerson = new ArrayList<>(); 
    List<Animal> listOfAnimal = new ArrayList<>(); 

Я хочу сделать что-то вроде этого:

if(...) list = listOfPerson; 
    else list = listOfAnimal; 

так, что я мог бы сделать много операций со списком:

list.get(i).getId(); 
    list.size(); 
    … 

Как это сделать?

+6

абстрактный базовый класс, мой друг. – nicomp

+1

Только если 'list' - это список некоторых общих типов родительских объектов. Интерфейс, базовый класс, даже 'Object' (хотя это довольно ограничивает). – David

+1

Do 'Animal' и' Person' '' расширяет 'общую базу 'class' или' реализует 'интерфейс', который предоставляет метод 'getId()'? –

ответ

0

Есть несколько способов достижения желаемого. Использование реализации маркера интерфейс или с помощью дженериков

Использование реализации маркера Интерфейс
EG:

public interface MarkerInterface { 

} 

public class Person implements MarkerInterface { 

} 

public class Animal implements MarkerInterface { 

} 

Теперь вы можете иметь список с интерфейсом маркера, который может содержать как объекты

List<MarkerInterface> livingThings; 

Это может удерживайте оба значения.

Или вы можете объявить его список как объект, как

List<Object> livingThings; 

Это может также держать оба значения.

0

Трюк в том, как вы объявляете общий список, который может содержать. Вы должны объявить его как

List<? extends CommonBaseClass> list; 

Например:

private static void listManipulation(boolean someBool) { 
    List<String> stringList = Arrays.asList("one", "two", "three"); 
    List<Integer> integerList = Arrays.asList(1, 2, 3); 

    // Object is the only common base class of String and Integer 
    List<? extends Object> objectList = someBool ? stringList : integerList; 
    System.out.println(objectList.size()); 
    System.out.println(objectList.get(0).toString()); 

    // This correctly produces an error. 
    // objectList.add("This won't work!"); 
} 
Смежные вопросы