Java >> Java tutorial >  >> Tag >> extends

Forskellen mellem Bounded Type-parameter (T-udvider) og øvre grænse-jokertegn (? forlænger)

Der er flere forskelle mellem de to syntakser under kompileringstiden :

  • Med den første syntaks kan du tilføje elementer til someList men med det andet kan du ikke. Dette er almindeligt kendt som PECS og mindre almindeligt kendt som PUT- og GET-princippet.
  • Med den første syntaks har du et håndtag til typeparameteren T så du kan bruge det til at gøre ting såsom at definere lokale variabler inden for metoden af ​​typen T , cast en reference til typen T , opkaldsmetoder, der er tilgængelige i klassen repræsenteret ved T , osv. Men med den anden syntaks har du ikke et håndtag til typen, så du kan ikke gøre noget af dette.
  • Den første metode kan faktisk kaldes fra den anden metode for at fange jokertegnet. Dette er den mest almindelige måde at fange awildcard på via en hjælpemetode.

    private static <T extends Number> void processList(List<T> someList) {
        T n = someList.get(0);
        someList.add(1,n); //addition allowed.   
    }
    
    private static void processList2(List<? extends Number> someList) {
        Number n = someList.get(0);
        //someList.add(1,n);//Compilation error. Addition not allowed.
        processList(someList);//Helper method for capturing the wildcard
    }
    

Bemærk, at da generiske lægemidler er kompileringstidssukker, er disse forskelle på et bredere niveau kun begrænset til kompileringen.


Java tag