2016-06-30 22 views
9

Ho un problema su Java 8 Runnable.Come assegnare un valore di riferimento metodo a Runnable

public static void main(String[] args) { 
    Runnable r1 = Test::t1; 
    Runnable r2 = Test::t2; 
    Runnable r3 = Test::t3; 
} 

public static void t1() { 

} 

public static String t2() { 
    return "abc"; 
} 

public static String t3(String t) { 
    return t; 
} 

Come il codice visualizzato, capisco r1 è giusto e r3 è sbagliato, ma non capisco il motivo per cui r2 è anche giusto. Qualcuno può aiutarmi a capirlo?

+0

@YassinHajaj Huh, hai ragione! Scusa, il mio errore :) – Hrabosch

+0

@Hrabosch Nessun problema :) –

+0

@ Hrabosch, r3 è sbagliato, non capisco perché r2 è giusto –

risposta

14

r2 va bene a causa section 15.13.2 of the JLS, che comprende:

Un'espressione metodo di riferimento è congruente con un tipo di funzione se entrambi seguente requisito:

  • Il tipo di funzione identifica un singola dichiarazione di compilazione corrispondente al riferimento.

  • Una delle seguenti condizioni:

    • Il risultato del tipo di funzione è annullata.
    • Il risultato del tipo di funzione è R, e il risultato dell'applicazione della conversione di acquisizione (§5.1.10) al tipo restituito del tipo di chiamata (§15.12.2.6) della dichiarazione di compilazione scelta è R '(dove R è il tipo di bersaglio che può essere usato per dedurre R '), e né R né R' è nulla, e R 'è compatibile con R in un contesto di assegnazione.

Fondamentalmente, sarebbe valida per scrivere t2(); e ignorare il valore restituito, quindi è valido per creare un riferimento metodo che chiama il metodo e ignora il valore restituito.

t3non valida, perché è necessario fornire un parametro, e Runnablenon significa prendere un parametro, quindi non ci sarebbe nulla da "passare" per il metodo.