gpt4 book ai didi

java-8 - 方法引用。不能对非静态方法进行静态引用

转载 作者:行者123 更新时间:2023-12-04 02:04:49 25 4
gpt4 key购买 nike

谁能给我解释一下
为什么将非静态方法引用传递给方法 File::isHidden没关系,
但将方法引用传递给非静态方法 MyCass::mymethod - 给我一个
“无法对非静态方法进行静态引用” ?

public static void main(String[] args) {
File[] files = new File("C:").listFiles(File::isHidden); // OK
test(MyCass::mymethod); // Cannot make a static reference to the non-static method
}

static interface FunctionalInterface{
boolean function(String file);
}

class MyCass{
boolean mymethod(String input){
return true;
}
}

// HELPER
public static void test(FunctionalInterface functionalInterface){}

最佳答案

对非静态方法的方法引用需要一个实例来操作。

listFiles 的情况下方法,参数是 FileFilteraccept(File file) .当你对一个实例(参数)进行操作时,你可以引用它的实例方法:

listFiles(File::isHidden)

这是简写
listFiles(f -> f.isHidden())

现在你为什么不能使用 test(MyCass::mymethod) ?因为您根本没有 MyCass 的实例操作。

但是,您可以创建一个实例,然后将方法引用传递给您的实例方法:
MyCass myCass = new MyCass(); // the instance
test(myCass::mymethod); // pass a non-static method reference


test(new MyCass()::mymethod);

编辑: MyCass需要声明为静态( static class MyCass )才能从主方法访问。

关于java-8 - 方法引用。不能对非静态方法进行静态引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32619125/

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