Есть вот такой пример кода:
interface MyFunc<T> {
boolean func(T a, T b);
}
class HighTemp {
private int hTemp;
public HighTemp(int hTemp) {
this.hTemp = hTemp;
}
boolean sameTemp(HighTemp hTemp2) {
return hTemp == hTemp2.hTemp;
}
boolean lessThanTemp(HighTemp hTemp2) {
return hTemp < hTemp2.hTemp;
}
}
class App {
static <T> int counter(T[] vals, MyFunc<T> f, T v) {
int count = 0;
for (int i = 0; i < vals.length; i++) {
if (f.func(vals[i], v)) {
count++;
}
}
return count;
}
public static void main(String[] args) {
int count;
HighTemp[] weekDayHighs = {
new HighTemp(89),
new HighTemp(82),
new HighTemp(90),
new HighTemp(89),
new HighTemp(89),
new HighTemp(91),
new HighTemp(84),
new HighTemp(83)
};
count = counter(weekDayHighs, HighTemp::sameTemp, new HighTemp(89));
System.out.println("Дней, когда максимальная температура была 89: " + count);
HighTemp[] weekDayHighs2 = {
new HighTemp(32),
new HighTemp(12),
new HighTemp(24),
new HighTemp(19),
new HighTemp(18),
new HighTemp(12),
new HighTemp(-1),
new HighTemp(13)
};
count = counter(weekDayHighs2, HighTemp::sameTemp, new HighTemp(12));
System.out.println("Дней, когда максимальная температура была 12: " + count);
count = counter(weekDayHighs, HighTemp::lessThanTemp, new HighTemp(89));
System.out.println("Дней, когда максимальная температура была меньше 89: " + count);
count = counter(weekDayHighs2, HighTemp::lessThanTemp, new HighTemp(19));
System.out.println("Дней, когда максимальная температура была меньше 19: " + count);
}
}
Есть обобщенный функциональный интерфейс. В нем есть метод с 2мя параметрами.
Но почему в counter передается метод (например HighTemp::sameTemp), который принимает 1 аргумент? По идеи же этот метод потом записывается в реализации интерфейса в место метода func, но в нем же 2 параметра. Почему потом метод func потом опять принимает 2 аргумента если его реализация (например HighTemp::sameTemp) принимает всего один??
Описал вопрос как смог, сам ничего не понимаю. Никак не доходит что происходит в коде.