使用方法引用来调用静态方法

时间:2019-04-24 05:45:49

标签: java methods reference static

我试图理解方法引用的概念。 在尝试不同的呼叫时,我偶然发现了一个我无法完全理解的场景。

使用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);

    }
}

2 个答案:

答案 0 :(得分:1)

方法为非静态时,

Animal::canClim
等价于
animal -> animal.canClim()
要么 (animal) -> animal.canClim()

lambda左侧的animal是使用者函数参数,主体在右侧。所以,是的,您正在在那里提供消费者。

静态方法的行为有所不同。
例如,Integer::parseInt将变成str -> Integer.parseInt(str)
 基本上,将参数提供给方法的参数。因此,在静态方法中,您需要具有一个参数才能使用方法引用。

答案 1 :(得分:0)

Consumer的方法accept带有一个参数。没有参数的静态方法不能转换为Consumer,可以吗?