Korzystne są wersje z zamiennika. Jeśli parametr ma typ List<?>
, oczywiste jest, że dowolny List
zostanie zaakceptowany. Jeśli akceptowany jest dowolny List
, nie ma powodu, aby nadawać parametrowi typu nazwę, więc pisanie <E>
będzie po prostu bałaganem. Z drugiej strony, jeśli parametr typu pojawia się dwa razy w podpisie, nie można używać symboli wieloznacznych. Na przykład ta sygnatura wymaga parametru typu.
public static <E> List<E> combineLists(List<E> list1, List<E> list2)
Właściwie w tym przykładzie będzie prawdopodobnie lepiej, gdyby argumenty musiały wpisać List<? extends E>
(jedynym sposobem, aby to zrobić bez symboli wieloznacznych byłoby mieć trzy parametry typu, totalny bałagan).
W efektywnej Javie zaleca się, że nawet jeśli parametr typu jest potrzebny w treści metody, powinieneś preferować wersję podpisu z symbolem wieloznacznym i napisać prywatną metodę pomocnika, aby było to możliwe. Na przykład:
public static void swapFirstAndLast(List<?> list) {
helper(list);
}
private static <E> void helper(List<E> list) {
int size = list.size();
E e = list.get(0);
list.set(0, list.get(size - 1)); // These lines would not be possible
list.set(size - 1, e); // If the type of list were List<?>
}
Zwięzłość, może? – aroth