imparo nuove funzionalità di Java 8.Java 8 può implementare l'interfaccia al volo per il riferimento al metodo?
sto giocando con diversi esempi e ho trovato uno strano comportamento:
public static void main(String[] args) {
method(Test::new);
}
static class Test{
}
private static void method(Supplier<Test> testSupplier){
Test test = testSupplier.get();
}
Questo codice viene compilato con successo, ma non ho idea di come funziona.
Perché lo standard Test::new
è accettabile come fornitore?
interfaccia Fornitore sembra molto semplice:
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Per implementare dinamicamente quale tipo di AFAIK accade c'è questa bestia: ['java.lang.invoke.LambdaMetafactory'] (https://docs.oracle.com/javase/8/docs/api/java/lang/ invoke/LambdaMetafactory.html) – zapl
Si noti che una dichiarazione di classe "vuota", come per il 'test di classe', ha implicitamente un costruttore no-arg. Ecco perché puoi scrivere 'new Test()' e farlo funzionare, qualsiasi motivo per cui un metodo lambda o di riferimento a questo costruttore funzioni. –
@Sotirios Delimanolis forse il primo commento alla domanda collegata è più rilevante – gstackoverflow