我试图理解方法引用的概念。 在尝试不同的呼叫时,我偶然发现了一个我无法完全理解的场景。
使用canClim
不带参数时,尽管forEach
接受了应该带参数的使用者,但可以毫无问题地传递给forEach
吗?将参数添加到canClim
时会阻止编译吗?
但是,如果将canClim
声明为静态,则在不将静态void canClim(Animal a)
添加到签名的情况下将无法编译。
因为它是静态的,所以不能在没有Animal类实例的情况下调用静态方法吗?
谢谢!
import java.util.*;
class Animal {
void canClim() {
System.out.println("I am a climber!");
}
}
public class MethodReferencer {
public static void main(String[] args) {
Animal a = new Animal();
Animal b = new Animal();
List<Animal> list = new ArrayList<>(Arrays.asList(a, b));
list.forEach(Animal::canClim);
}
}
答案 0 :(得分:1)
方法为非静态时,
Animal::canClim
等价于
animal -> animal.canClim()
要么
(animal) -> animal.canClim()
lambda左侧的animal
是使用者函数参数,主体在右侧。所以,是的,您正在在那里提供消费者。
静态方法的行为有所不同。
例如,Integer::parseInt
将变成str -> Integer.parseInt(str)
。
基本上,将参数提供给方法的参数。因此,在静态方法中,您需要具有一个参数才能使用方法引用。
答案 1 :(得分:0)
Consumer
的方法accept
带有一个参数。没有参数的静态方法不能转换为Consumer
,可以吗?