Can someone explain to me,
why passing a non-static method-reference to method File::isHidden is ok,
but passing method reference to a non-static method MyCass::mymethod - gives me a
"Cannot make a static reference to the non-static method" ?
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){}
Method references to non-static methods require an instance to operate on.
In the case of the listFiles method, the argument is a FileFilter with accept(File file). As you operate on an instance (the argument), you can refer to its instance methods:
listFiles(File::isHidden)
which is shorthand for
listFiles(f -> f.isHidden())
Now why can't you use test(MyCass::mymethod)? Because you simply don't have an instance of MyCass to operate on.
You can however create an instance, and then pass a method reference to your instance method:
MyCass myCass = new MyCass(); // the instance
test(myCass::mymethod); // pass a non-static method reference
or
test(new MyCass()::mymethod);
Edit: MyCass would need to be declared static (static class MyCass) in order to be accessible from the main method.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With