tentativo di implementare il codice simile a quello riscontrato nell'esempio ordine-funzioni superiore da http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-6Scala ActionListener/tipo funzione anonima disadattamento
val button = new JButton("test")
button.addActionListener{ e:ActionEvent => println("test") }
add(button)
porta alla seguente
error: type mismatch;
found : (java.awt.event.ActionEvent) => Unit
required: java.awt.event.ActionListener
button.addActionListener{ e:ActionEvent => println("test") }
^
Ciò è vero almeno con il compilatore Scala versione 2.7.6.final sul mio sistema. Sono in grado di ottenere ciò che voglio nel modo in stile Java di implementare esplicitamente un ActionListener anonimo.
button.addActionListener(new ActionListener() {
def actionPerformed(e:ActionEvent) { println("test") }
})
Per quanto ho capito, Scala dovrebbe essere in grado di utilizzare anatra tipizzazione per rendere questo esplicito attuazione ActionListener inutili; quindi perché non funziona qui? Non ho quasi nessuna esperienza pratica di tipizzazione delle anatre a questo punto.
Non come fanboy, ma vale la pena notare che sia Groovy che le varie proposte di chiusura Java includevano conversioni implicite da tipi di funzione appropriati a interfacce a metodo singolo. Questo è molto conveniente per interfacce come Runnable o Comparable. In Scala, devi eseguire questa conversione manualmente o affidarti a librerie pimpate per farlo. –
@Dave Sì ... se il tipo non corrisponde, esegui il cast automatico. Penso che dovrebbe essere ovvio perché Scala non ha scelto in questo modo. –
Oh, certo. Ha senso solo per Groovy e Java perché non includono alcun buon metodo per estendere le librerie esistenti, quindi hanno bisogno di questa conversione automatica per rendere il lavoro con legacy Java non doloroso. Scala ha protettori per le librerie legacy e le nuove librerie dovrebbero essere (e vengono) scritte per favorire forme funzionali su interfacce a metodo singolo. –