Kotlin: lambda come implementazione dell’interfaccia

la molla esistente JdbcTemplate ha la firma:

public <T> List<T> query(String sql, RowMapper<T> rowMapper)

e posso chiamarlo con un lambda che implementa l’interfaccia:

jdbcTemplate.query("select ...", { rs, _ -> 5 })

ma quando dichiaro la stessa funzione in Kotlin:

fun <T> query(sql: String, rowMapper: RowMapper<T>): List<T> = TODO()

e cercare di chiamare allo stesso modo:

query("select ...", { rs, _ -> 5 })

ottengo un errore di compilazione

Type inference failed:
fun query
(
sql: String,
rowMapper: RowMapper
)
: List
cannot be applied to
(
String,
(???, ???) → Int
)

devo scrivere

query("select ...", RowMapper{ rs, _ -> 5 })

perché? perché? c’è un modo per fornire solo lambda?

EN From: kotlin: lambda as an interface implementation

More similar articles:

4 Comments

  1. sfondo sfondo sfondo

    in Java, un’espressione lambda può essere superata in un contesto in cui è prevista un’interfaccia funzionale. esempio di codice Java:

    jdbcTemplate.query("select ...", (rs, _) -> 5);

    in Kotlin, non esiste una conversione implicita dalle espressioni lambda alle interfacce. piuttosto che interfacce funzionali, Kotlin fornisce tipi di funzioni native con la sintassi (Params) -> ReturnType. per rendere più facile l’interoperabilità con Java, c’è comunque una conversione dall’espressione Kotlin lambda alle interfacce funzionali Java, aggiungendo il nome dell’interfaccia:

    query("select ...", RowMapper { rs, _ -> 5 })

    soluzione soluzione soluzione soluzione

    non è possibile passare una lambda direttamente — tuttavia si potrebbe scrivere una funzione di estensione che prende un tipo di funzione e la inoltra a query():

    fun JdbcTemplate.query(sql: String, mapper: (A, B) -> Int) =
        query(sql, RowMapper { a, b -> mapper(a, b) })

    questo può essere chiamato nel modo in cui si desidera. notate che non avete bisogno delle parentesi intorno a tutti gli argomenti, a causa della speciale sintassi che Kotlin permette di estrarre le espressioni lambda:

    jdbc.query("select ...") { rs, _ -> 5 }

    vedi anche qui, dove ho spiegato questo comportamento in dettaglio.

Leave a Reply

Your email address will not be published. Required fields are marked *