2015-01-19 21 views
39

In Java 8 possiamo avere un riferimento a un metodo di un'istanza di Classe. Ecco un esempioRiferimento al metodo di una particolare istanza in Kotlin

Function1<Integer, Object> ref = a::getItem; 

a è un'istanza della classe Adapter che ha il metodo Object getItem(int i).

Possiamo fare lo stesso in Kotlin? Ho provato la stessa sintassi senza successo. Finora sono stato solo in grado di creare un metodo di riferimento di estensione in questo modo:

val ref: Adapter.(Int) -> Any = Adapter::getItem 

Ma qui ho ancora bisogno di un'istanza di un Adapter per invocarlo. L'altro alterantive che vedo è la definizione di un lambda come questo:

val ref: (Int) -> Any = { a.getItem(it) } 
+11

I riferimenti di acquisizione non sono ancora supportati, ma saranno supportati in futuro –

+0

possibile duplicato di [Kotlin: come passare una funzione come parametro a un altro?] (Http://stackoverflow.com/questions/16120697/kotlin- how-to-pass-a-function-as-parameter-to-another) – Ram

+0

L'opzione che utilizza un lambda è il miglior metodo attuale di -0, sebbene cambierà in futuro per essere supportato come @AndreyBreslav cita –

risposta

20

Dal Kotlin 1.1, è possibile utilizzare bound callable references per farlo:

val f = a::getItem 

list.forEach(myObject::myMethod) 

precedenti versioni Kotlin don' Ho questa caratteristica e ti chiedo di fare una lambda ogni volta eccetto per these simple cases.

+1

Grazie per il link della proposta. Per la funzione di un oggetto Companion, solo questa sintassi sembra funzionare [con Kotlin 1.3]: '(ClassA) :: function' o' ClassA.Companion :: function'. Il primo può essere usato solo in Kotlin, quindi per coerenza tra codice Java e Kotlin, meglio usare la seconda sintassi se è necessario fare riferimento anche in Java. – Metallica

Problemi correlati