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