Witajcie!
Kończę ogarniać lambdę i mam do was wszystkich pytanie względem przykładu z książki (który już przybliżam).
Mam taki oto interfejs.
public interface MyFunc<T> {
int func(T[] vals, T t);
}
Taką klasę
public class MyArrayOps {
static <T> int countMatching(T[] vals, T v) {
int count = 0;
for (int i = 0; i < vals.length; i++) {
if (vals[i] == v) {
++count;
}
}
return count;
}
}
Oraz klasę wykonawczą
public class GenericMethodRefDemo {
static <T> int myOp(MyFunc<T> f, T[] vals, T v) {
return f.func(vals, v);
}
public static void main(String[] args) {
Integer[] vals = {1,2,3,4,2,3,4,4,5};
String[] strs = {"Jeden", "Dwa", "Trzy", "Dwa"};
int count;
count = myOp(MyArrayOps::countMatching, vals, 4);
System.out.println(count);
count = myOp(MyArrayOps::countMatching, strs, "Dwa");
System.out.println(count);
}
}
Moje pytanie brzmi: dlaczego podając tablicę obiektów String
i osobny obiekt typu String
, czyli ta linijka
count = myOp(MyArrayOps::<String>countMatching, strs, "Dwa");
zwraca poprawny wynik? W końcu metoda countMatching
porównuje obiekty za pomocą operatora ==
, co normalnie porównałoby referencje...
Czy lambda wnioskując typ podanych obiektów korzysta niejawnie z metody equals
przy użyciu operatora ==
?