mogę myśleć o poniższych różnicami:
a) Modyfikacja listy wewnątrz metody, należy rozważyć poniżej kod:
private static <T extends Number>void processList(List<T> someList)
{
T t = someList.get(0);
if (t.getClass() == Integer.class)
{
Integer myNum = new Integer(4);
someList.add((T) myNum);
}
}
// Upper bound wildcard
private static void processList2(List<? extends Number> someList)
{
Object o = someList.get(0);
if (o instanceof Integer)
{
Integer myNum = new Integer(4);
someList.add(myNum); // Compile time error !!
}
}
Z zamiennika nie można dodać elementy do listy! Kompilator mówi, że nie wie, co to jest myNum
. Ale w pierwszej metodzie można dodać Integer
, najpierw sprawdzając, czy T
jest Integer
, bez błędu czasu kompilacji.
b) Pierwsza metoda nazywana jest metodą ogólną. Jest on zgodny ze składnią zdefiniowaną dla generic method. Górne ograniczenia określone w definicji metody są używane do oznaczania typów parametrów ograniczających.
Drugi NIE jest koniecznie nazywany metodą ogólną, jest to normalna metoda, która akceptuje ogólny parametr . Symbol wieloznaczny ?
z extends
słowem kluczowym jest używany jako środek relaksujący typy, które metoda może zaakceptować.