【问题标题】:java - pass metod reference to an interface argument? [duplicate]java - 将metod引用传递给接口参数? [复制]
【发布时间】:2018-01-17 15:52:48
【问题描述】:

我遇到了这个例子:

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");
    }
}

为什么会这样?特别是方法引用被传递给带有接口参数的函数的部分。

        count = counter(weekDayHighs, HighTemp::sameTemp, new HighTemp(89));

为什么 HighTemp::sameTemp 与 MyFunc152 一样有效?如果 sameTemp 不是静态的,为什么传递 HighTemp::sameTemp 不会产生编译错误?

【问题讨论】:

标签: java java-8


【解决方案1】:

好吧,您将HighTemp[] 传递给您的counter 方法,这意味着它需要MyFunc152&lt;HighTemp&gt; 的实例作为第二个参数。

现在,HighTemp::sameTemp 是对具有两个 HighTemp 参数的方法的方法引用(其中第一个是隐式的 - 将调用该方法的 HighTemp 实例)和一个 boolean 返回类型。这与MyFunc152&lt;HighTemp&gt; 功能接口的boolean func(HighTemp v1, HighTemp v2) 方法完全匹配。

在你的counter方法里面,当你用f.func(vals[i], v)调用函数式接口方​​法时,相当于调用vals[i].sameTemp(v)

您可以传递等效的 lambda 表达式 (HighTemp t1,HighTemp t2)-&gt;t1.sameTemp(t2)(或简单地 (t1,t2)-&gt;t1.sameTemp(t2)),而不是传递方法引用 HighTemp::sameTemp

【讨论】:

  • 所以 MyFunc152 func(T v1, T v2) 被映射到 (h1, h2) -> h1.sameTemp(h2)。想我明白了!谢谢。
猜你喜欢
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多