我遇到了这个例子:
package br.com.teste;
class HighTemp {
private int hTemp;
HighTemp(int ht) {
hTemp = ht;
}
boolean sameTemp(HighTemp ht2) {
return hTemp == ht2.hTemp;
}
}
interface MyFunc152<T> {
boolean func(T v1, T v2);
}
class InstanceMethWithObjectRefDemo {
static <T> int counter(T[] vals, MyFunc152<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) };
count = counter(weekDayHighs, HighTemp::sameTemp, new HighTemp(89));
System.out.println(count + " days had a same of 89");
}
}
为什么会这样?特别是将方法引用传递给带有interface参数的函数的部分。
count = counter(weekDayHighs, HighTemp::sameTemp, new HighTemp(89));
为什么HighTemp :: sameTemp作为MyFunc152有效?如果sameTemp不是静态的,为什么传递HighTemp :: sameTemp不会产生编译错误?
答案 0 :(得分:2)
嗯,您传递的是counter
方法HighTemp[]
,这意味着它需要MyFunc152<HighTemp>
的实例作为第二个参数。
现在,HighTemp::sameTemp
是对具有两个HighTemp
参数的方法的方法引用(其中第一个是隐式的 - 将调用该方法的HighTemp
实例)和一个{ {1}}返回类型。这与boolean
功能界面的boolean func(HighTemp v1, HighTemp v2)
方法完全匹配。
在MyFunc152<HighTemp>
方法中,当您使用counter
调用功能界面方法时,它相当于调用f.func(vals[i], v)
。
您可以传递等效的lambda表达式vals[i].sameTemp(v)
(或简称为HighTemp::sameTemp
),而不是传递方法引用(HighTemp t1,HighTemp t2)->t1.sameTemp(t2)
。