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 typenT
, cast en reference til typenT
, opkaldsmetoder, der er tilgængelige i klassen repræsenteret vedT
, 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.