Kshitiz Sharma Kshitiz Sharma - 1 month ago 12
Java Question

How does method reference casting work?

public class Main {
interface Capitalizer {
public String capitalize(String name);
}

public String toUpperCase() {
return "ALLCAPS";
}

public static void main(String[] args) {
Capitalizer c = String::toUpperCase; //This works
c = Main::toUpperCase; //Compile error
}
}


Both are instance methods with same signature. Why does one work and the other doesn't?

Signature of
String::toUpperCase
:
String toUpperCase();

Answer

There are 3 constructs to reference a method:

  1. object::instanceMethod
  2. Class::staticMethod
  3. 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.

Comments