Sobes.tech
Middle

Šta je wildcard u Javi?

sobes.tech АИ

Одговор од АИ

Звездица (?) у Јави се користи у генерицима за представљање непознатог типа. Омогућава рад са колекцијама које садрже елементе различитих компатибилних типова, без строге везаности за конкретан тип.

Главни сценарији коришћења:

  1. ? (Глобални 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. ? (Глобални wildcard са доњим ограничењем): Означава било који тип који је супертп или имплементира дат интерфејс или је сама класа. Пример: 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. ? (Непознати wildcard): Означава било који тип. Еквивалентно ? extends Object. Користи се када није важан тачан тип елемената колекције, нпр. за проверу величине или чишћење.

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

Wildcards повећавају флексибилност кода, омогућавајући методама да раде са ширим спектром типова колекција, уз очување безбедности типа. Са њима се може избећи дуплирање кода за методе које извршавају сличне операције над колекцијама различитих, али компатибилних типова.