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.