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

Java Generisk type:forskel mellem List <? udvider Nummer> og Liste <T udvider Nummer>

Grundlæggende forskel er, hvis du bruger T extends Number så kan du henvise til typen T :
list.add((T) new Integer(40));

Hvor som om du bruger ? extends Number så kan du ikke referer til typen, men du kan stadig sige:
((List<Integer>)list).add((int) s);


Isoleret set er der ikke den store forskel. Dog to forekomster af List<? extends Number> i en enkelt sammenhæng er fuldstændig uafhængige, mens to forekomster af List<T extends Number> i en enkelt sammenhæng referer til den samme T og samme interface.

public void addAll(List<? extends Number> to, List<? extends Number> from) {
    for (Number n: from) {
        to.add(n);
    }
}

Denne metode mislykkes, fordi n kan ikke føjes til to , og mislykkedes også, fordi medlemstyperne from og to kan være helt anderledes.

public <T> void addAll(List<T extends Number> to, List<T extends Number> from) {
    for (T n: from) {
        to.add(n);
    }
}

Denne metode kompilerer fint. Det er ikke nødvendigt; Collections har en bedre version, men den kører uden fejl.


Java tag