gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:37:26 30 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 方法中,参数是带有 accept(File file)FileFilter。当你操作一个实例(参数)时,你可以引用它的实例方法:

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)才能从 main 方法访问。

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

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