Java 8 方法 对非静态方法的引用

2022-09-02 22:55:57

为什么这不起作用?我收到编译器错误“无法对非静态方法打印进行静态引用...”

public class Chapter3 {
    public void print(String s) {
        System.out.println(s);
    }
    public static void main(String[] args) {
        Arrays.asList("a", "b", "c").forEach(Chapter3::print);
    }
}

答案 1

无论您使用方法引用、lambda 表达式还是普通方法调用,实例方法都需要适当的实例来调用。该实例可以由函数调用提供,例如,如果预期它有效。但是,由于在您的案例中期望 a,因此在范围内没有实例。您可以通过更改为方法或提供实例作为方法调用的目标来轻松解决此问题:forEachBiConsumer<Chapter3,String>forEachConsumer<String>Chapter3Chapter3.printstatic

public class Chapter3 {
    public void print(String s) {
        System.out.println(s);
    }
    public static void main(String[] args) {
        Arrays.asList("a", "b", "c").forEach(new Chapter3()::print);
    }
}

在这里,将捕获 的结果,一个新的实例 ,用于方法对其方法的引用,并且可以构造在该实例上调用该方法。new Chapter3()Chapter3printConsumer<String>


答案 2

以防万一,如果您尝试从运行代码的同一对象应用实例方法

Arrays.asList("a", "b", "c").forEach(this::print);

推荐