Назад к вопросам
Middle
82
questionbank

Что такое wildcard в Java?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Wildcard (?) в Java используется в обобщениях (generics) для представления неизвестного типа. Он позволяет работать с коллекциями, содержащими элементы различных совместимых типов, без строгой привязки к конкретному типу.

Основные сценарии использования:

  1. ? (Upper Bounded Wildcard): Обозначает любой тип, являющийся наследником или реализующим указанный класс/интерфейс. Используется для чтения данных из коллекции. Пример: List<? extends Number> может содержать List<Integer>, List<Double>, .getList<Long>.

    // Чтение из коллекции с верхним ограничением
    public void processNumbers(List<? extends Number> numbers) {
        for (Number n : numbers) {
            System.out.println(n);
        }
        // numbers.add(new Integer(10)); // Ошибка компиляции - нельзя добавлять элементы
    }
    
  2. ? super (Lower Bounded Wildcard): Обозначает любой тип, являющийся предком указанного класса/интерфейса или сам этот класс/интерфейс. Используется для записи данных в коллекцию (принцип PECS: Producer Extends, Consumer Super). Пример: List<? super Integer> может содержать List<Integer>, List<Number>, List<Object>.

    // Запись в коллекцию с нижним ограничением
    public void addIntegers(List<? super Integer> list) {
        list.add(1);
        list.add(new Integer(2));
        // Object o = list.get(0); // Возвращает Object, так как точный тип неизвестен
    }
    
  3. ? (Unbounded Wildcard): Обозначает любой тип. Эквивалентно ? extends Object. Используется, когда неважен фактический тип элементов коллекции, например, для проверки размера или очистки.

    // Работа с коллекцией любого типа
    public void printList(List<?> list) {
        for (Object obj : list) {
            System.out.println(obj);
        }
        // list.add("hello"); // Ошибка компиляции - нельзя добавлять элементы (кроме null)
    }
    

Wildcards повышают гибкость кода, позволяя методам работать с более широким диапазоном типов коллекций, сохраняя при этом типобезопасность. С их помощью можно избежать дублирования кода для методов, выполняющих однотипные операции над коллекциями разных, но совместимых типов.