powinno być zamiast bo jeśli E jest porównywalne, dzieci E muszą być porównywalne, podczas gdy rodzice E może nie być.
Comparator
nie polega na obiektach Comparable
.
Jest często używany jako alternatywa lub uzupełnienie.
W rzeczywistości, to konstruktor
public TreeSet(Comparator<? super E> comparator) {...}
mogło:
public TreeSet(Comparator<E> comparator) {... }
ale podając niższą ograniczony wieloznaczny, programiści JDK warunkiem większą elastyczność dla klas klienckich poprzez umożliwienie Comparator
być współdziała zarówno z bieżącymi wystąpieniami klas, jak i instancjami klasy nadrzędnej. W niektórych przypadkach może to mieć sens.
Teraz:
public TreeSet(Comparator<? extend E> comparator) {
nie może być ważny, ponieważ oznacza, że można skończyć z compare()
metody, która określa typ podklasy jako parametry.
Ale elementy z Set
mogą zawierać wystąpienia określonej podklasy, ale nie tylko.
Wyobraźmy sobie ten kod:
TreeSet<CharSequence> set = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
...
}
});
set.add("string");
set.add(new StringBuilder());
...
Chcę porównać String
s ale Set
może zawierać String
instancji, ale także wszelkie podklasa CharSequence
takich jak StringBuilder
, CharBuffer
, itp ...
A jeśli był CharSequence
nie abstract
, może również zawierać ich wystąpienia.
W tym przykładzie rozumiemy, że koncepcyjnie Comparator<? extend E>
jest nieprawidłowy.