Что такое wildcard в Java?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Wildcard (?) в Java используется в обобщениях (generics) для представления неизвестного типа. Он позволяет работать с коллекциями, содержащими элементы различных совместимых типов, без строгой привязки к конкретному типу.
Основные сценарии использования:
-
?(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)); // Ошибка компиляции - нельзя добавлять элементы } -
? 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, так как точный тип неизвестен } -
?(Unbounded Wildcard): Обозначает любой тип. Эквивалентно? extends Object. Используется, когда неважен фактический тип элементов коллекции, например, для проверки размера или очистки.// Работа с коллекцией любого типа public void printList(List<?> list) { for (Object obj : list) { System.out.println(obj); } // list.add("hello"); // Ошибка компиляции - нельзя добавлять элементы (кроме null) }
Wildcards повышают гибкость кода, позволяя методам работать с более широким диапазоном типов коллекций, сохраняя при этом типобезопасность. С их помощью можно избежать дублирования кода для методов, выполняющих однотипные операции над коллекциями разных, но совместимых типов.