Le questioni di carattere generale sono:Come eseguire indirettamente un riferimento al metodo in Java 8?
- Quando si utilizza la sintassi
object::aMethod
, può essere convertito in un tipo come ad esempioMethodHandle
un'interfaccia funzionale? - Se no, come può un riferimento al metodo essere invocato indirettamente in Java 8 se possibile?
Per fare un esempio, immaginiamo ci piacerebbe avere un MethodRefRunner
come:
class MethodRefRunner {
static void execute(Object target, WHATTYPE mref, Object... args) {
mref.apply(args);
}
}
E può essere usato come: MethodRefRunner.execute(o, o::someMethod, someParam)
In questo frammento di codice, un'opzione per WHATTYPE
è java.util.function.Function
ma molto restrittivo. Come menzioni this answer, prima della versione b75, c'era uno java.util.function.Block
disponibile e potrebbe essere utile.
Dall'altro lato, nessuna possibilità che WHATTYPE
possa essere in qualche modo convertita in java.lang.invoke.MethodHandle
?
Nota agli esperti di Java: Si prega di rifinire il titolo delle domande secondo necessità.
In Scala, è possibile forzare un * metodo * in un valore * funzione *, questa è l'espansione * eta * (c'è una differenza tra * metodo * e * funzione * in Scala). Per quanto riguarda il caso che descrivi, il compilatore Scala è abbastanza intelligente da accettarli entrambi. – Beryllium
@Beryllium In effetti un bel contrasto e questo è anche il motivo per cui mi chiedevo il motivo per cui Java 8 non ha optato per questo. – nobeh
@nobeh Java 8 si attacca alle interfacce funzionali perché l'aggiunta di tipi di funzione avrebbe comportato modifiche molto più grandi del linguaggio. Potrebbero venire più tardi. –