public class Main {
interface Capitalizer {
public String capitalize(String name);
}
public String toUpperCase() {
return \"ALLCAPS\";
There are 3 constructs to reference a method:
object::instanceMethod
Class::staticMethod
Class::instanceMethod
The line:
Capitalizer c = String::toUpperCase; //This works
use 3'rd construct - Class::instanceMethod
. In this case first parameter becomes the target of the method. This construct is equivalent (translates) to following Lambda:
Capitalizer = (String x) -> x.toUpperCase();
This Lambda expression works because Lambda gets String
as parameter and returns String
result - as required by Capitalizer
interface.
The line:
c = Main::toUpperCase; //Compile error
Translates to:
(Main m) -> m.toUpperCase();
Which does not work with the Capitalizer
interface. You could verify this by changing Capitalizer
to:
interface Capitalizer {
public String capitalize(Main name);
}
After this change Main::toUpperCase
will compile.