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