uczę nowych funkcji Java 8.Czy Java 8 może implementować interfejs w locie, aby uzyskać odwołanie do metody?
gram z różnymi przykładami i znalazłem dziwne zachowanie:
public static void main(String[] args) {
method(Test::new);
}
static class Test{
}
private static void method(Supplier<Test> testSupplier){
Test test = testSupplier.get();
}
Ten kod kompiluje się pomyślnie, ale nie mam pojęcia jak to działa.
Dlaczego Test::new
akceptowalny jako dostawca?
Dostawca interfejs wygląda bardzo prosta:
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Do dynamicznego wdrażania tego typu zdarzeń AFAIK jest ta bestia: ['java.lang.invoke.LambdaMetafactory'] (https://docs.oracle.com/javase/8/docs/api/java/lang/ invoke/LambdaMetafactory.html) – zapl
Należy zauważyć, że "pusta" deklaracja klasy, na przykład dla twojego "testu klasy", domyślnie ma konstruktor no-arg. Dlatego możesz napisać 'new Test()' i sprawić by działało, niezależnie od tego, dlaczego działa odwołanie do lambda lub metody do tego konstruktora. –
@Sotirios Delimanolis może pierwszy komentarz do połączonego pytania jest bardziej odpowiedni – gstackoverflow