gpt4 book ai didi

java - 如何在函数式接口(interface)和方法引用上下文中的函数之间解释参数和自变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:30:41 24 4
gpt4 key购买 nike

interface MyFunc<T> {
boolean func(T v1, T v2);
}

class Foo {
private int value;

Foo(int v) { value = v; }

boolean isGreater(Foo obj) { <-- (*)
return value > obj.value; <-- (**)
}
}

class Demo {
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;

Foo[] values = new Foo[10];

for (int i = 0; i < values.length; i++)
values[i] = new Foo(i);

count = counter(values, Foo::isGreater, new Foo(5));

System.out.println("values bigger " + count);
}
}

此代码有一个函数 isGreater (*),它计算小于作为参数传递的值的值的数量。我的困惑是如何interface MyFunc<T>推断这个比较两个 Foo 实例变量值的返回语句 (**) 有 2 个参数。为了更清楚地说明如何MyFunc<T>需要 (T v1, T v2)作为参数,这是与函数 isGreater(Foo obj) 的匹配它以 Foo 类型的引用作为参数。

最佳答案

请注意,isGreater 是一个实例 方法。您将如何调用 Foo 的实例方法?除了该方法所需的所有参数之外,您还需要 Foo实例

isGreater 的情况下,您实际上需要两个 Foo 实例来调用它(即使它只需要 1 个 Foo 作为参数):

foo1.isGreater(foo2)
^^^^ ^^^^

另请注意,当您使用 Foo::isGreater 时,您没有给它任何 Foo 实例来调用 isGreater!通常这不适用于实例方法,但 Java 语言设计者看到了它的到来并允许这样做。

在任何情况下,您都需要一个 Foo 实例来调用 isGreater 和另一个实例作为参数传递。因此,我们可以将isGreater“重写”为静态方法,如下所示:

public static boolean isGreater(Foo foo1, Foo foo2) {
return foo1.isGreater(foo2);
}

您调用 isGreater 的实例作为参数被“提升”了!这并不是真的想要在幕后发生,但这仍然可以解释为什么这首先是可能的。

关于java - 如何在函数式接口(interface)和方法引用上下文中的函数之间解释参数和自变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56947953/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com