java - 将metod引用传递给接口参数?

时间:2018-01-17 15:52:48

标签: java java-8

我遇到了这个例子:

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不会产生编译错误?

1 个答案:

答案 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)