Sobes.tech
Middle

Чӣ гуна wildcard дар Java аст?

sobes.tech AI

Ҷавоб аз AI

В Java знак подстановки (?) се използва в обобщенията (generics) за представяне на неизвестен тип. Той позволява работа с колекции, съдържащи елементи от различни съвместими типове, без строга привързаност към конкретен тип.

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

  1. ? (горна ограничена подстановка): Обозначава всеки тип, който е наследник или реализира даден клас/интерфейс. Използва се за четене на данни от колекция. Пример: 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 (долна ограничена подстановка): Обозначава всеки тип, който е предшественик на даден клас/интерфейс или самият този клас/интерфейс. Използва се за записване на данни в колекция (принцип 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. ? (неограничен заместител): Обозначава всеки тип. Еквивалентен е на ? extends Object. Използва се, когато не е важен фактическият тип на елементите на колекцията, например за проверка на размера или почистване.

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

Звездните знаци увеличават гъвкавостта на кода, позволявайки на методите да работят с по-широк диапазон от типове колекции, като същевременно запазват типобезопасността. С тяхна помощ може да се избегне дублиране на кода за методи, изпълняващи еднакви операции върху колекции от различни, но съвместими типове.