Как в Java создать коллекцию для элементов разных типов?

«Как в Java создать коллекцию для элементов разных типов?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, создать такую коллекцию можно, но это считается плохой практикой из-за потери типобезопасности. Есть несколько технических способов:

1. Использование Collection<Object>:

List<Object> mixedList = new ArrayList<>();
mixedList.add("Text");     // String
mixedList.add(100);        // Integer
mixedList.add(true);       // Boolean

2. Использование сырого типа (Raw Type):

List list = new ArrayList(); // Предупреждение компилятора
list.add("Text");
list.add(100);

3. Использование коллекции с верхнеуровневым предком:

List<Number> numbers = new ArrayList<>();
numbers.add(10);    // Integer
numbers.add(3.14);  // Double
// Все элементы — подтипы Number

Главная проблема и решение: При извлечении элементов обязательно нужна проверка типа (instanceof) и приведение:

for (Object obj : mixedList) {
    if (obj instanceof String) {
        String s = (String) obj;
        System.out.println(s.length());
    } else if (obj instanceof Integer) {
        Integer i = (Integer) obj;
        System.out.println(i * 2);
    }
}

Рекомендация: Вместо коллекций Object используйте:

  • Дженерики с конкретным типом.
  • Классы-обертки (DTO) для разнотипных данных.
  • Паттерн «Посетитель» (Visitor) для обработки элементов разного типа в структуре данных.