W jaki sposób Java wie, które odwołanie metody String::compareTo
użyć do wywoływania Collections.sort(someListOfStrings, String::compareTo);
? compareTo
nie jest statyczny i musi znać value
"lewej strony" porównania.W jaki sposób Java 8 wie, które odwołanie do metody String :: compareTo należy zastosować podczas sortowania?
Odpowiedz
Załóżmy, że używasz Referencyjna metoda dla Comparator
interfejsu:
Comparator<String> cmp = String::compareTo;
Po wywołaniu cmp.compare(left, right)
(który jest "single abstrakcyjny sposób" lub "SAM" z Comparator
Interface), magia następuje:
int result = cmp.compare(left, right);
| |
/------------------------/ |
| /---------------/
| |
left.compareTo(right);
Zasadniczo wszystkie parametry SAM są konwertowane na parametry określonej metody, ale obiekt this
(który znajduje się po lewej stronie) jest również liczony jako parametr.
Nazywa się to odwołaniem do metody * niezwiązanej instancji *. –
@Tagir Valeev, ale jak dopasowuje 'String :: compareTo'' Komparator
@stantonk, pomyśl o 'tym' jako o jeszcze jednym parametrze, więc 'public int compareTo (String anotherString)' jest jak 'public static int compareTo (String this, String anotherString)'. Zwykle w językach OOP wewnętrznie działa w następujący sposób: wskaźnik obiektu (odwołanie) jest konwertowany na pierwszy parametr funkcji/metody. –
OK, źródło Collections.sort() wygląda następująco:
public static <T> void sort(List<T> list, Comparator<? super T> c) {
Object[] a = list.toArray();
Arrays.sort(a, (Comparator)c);
ListIterator i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set(a[j]);
}
}
myślę, że jest całkiem jasne teraz. Zawartość jest listą. Oznacza to, że ma zamówienie, a produkty są traktowane kolejno w tej kolejności.
Przepraszam, to nie odpowiada na moje pytanie. Próbuję zrozumieć, jak Java wie, aby użyć poprawnego odwołania do metody 'String :: compareTo' dla każdego elementu na liście do posortowania. – stantonk
więc na przykład, powiedzmy, że masz listę '[" c "," b "," a "]'. pierwszy element na tej liście, "c", jest instancją klasy "String", która ma właściwość "wartość", która jest tablicą znaków zawierającą pojedynczy znak "c". 'compareTo' dokonuje porównania pomiędzy" c "i" b "głęboko w metodzie' Collections.sort', np. 'if (c.compare (a [runHi ++], a [lo]) <0)'. Nie widzę, jak odniesienie do metody dostaje cię z "porównywalne" do "komparatora". – stantonk
co to jest 'String :: compareTo' –
Twoje pytanie nie jest jasne:' Collections.sort' sortuje elementy kolekcji, 'String :: compareTo 'służy do porównywania dwóch ciągów w tej kolekcji. jeśli string a
alfasin