I learn new features of Java 8.
I am playing with different examples and I have found a strange behaviour:
public static void main(String[] args) {
method(Test::new);
}
static class Test{
}
private static void method(Supplier<Test> testSupplier){
Test test = testSupplier.get();
}
This code compiles successfully but I have no idea how it works.
Why is Test::new
acceptable as Supplier?
Supplier interface looks very simple:
@FunctionalInterface
public interface Supplier<T> {
T get();
}
The
Supplier
interface has a single (functional) method that:Therefore, any method that comply with those two points, comply with the functional contract of
Supplier
(because the methods will have the same signature).Here, the method in question is a method reference. It takes no parameters and returns a new instance of
Test
. You could rewrite it to:Test::new
in syntactic sugar for this lambda expression.