Code implementieren Der Versuch, ähnlich wie in der übergeordneten Funktions Beispiel von http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-6Scala Action/anonyme Funktion Typenkonflikt
val button = new JButton("test")
button.addActionListener{ e:ActionEvent => println("test") }
add(button)
führt zu folgendem
error: type mismatch;
found : (java.awt.event.ActionEvent) => Unit
required: java.awt.event.ActionListener
button.addActionListener{ e:ActionEvent => println("test") }
^
bei Dies gilt gefunden am wenigsten mit Scala-Compiler-Version 2.7.6.final auf meinem System. Ich bin in der Lage zu erreichen, was ich will in der Java-Stil Weise explizit implementieren einen anonymen ActionListener.
button.addActionListener(new ActionListener() {
def actionPerformed(e:ActionEvent) { println("test") }
})
Soweit ich verstehe, sollte Scala der Lage sein, Ente-Eingabe zu verwenden, um diese explizite Implementierung von Action zu machen unnötig; Warum funktioniert es hier nicht? Ich habe zu diesem Zeitpunkt praktisch keine Erfahrung mit der Entchenung.
Nicht als Fanboy, aber es ist erwähnenswert, dass sowohl Groovy als auch die verschiedenen Java-Schließvorschläge implizite Konvertierungen von entsprechenden Funktionstypen zu einzelnen Methodenschnittstellen enthalten. Dies ist sehr praktisch für Schnittstellen wie Runnable oder Comparable. In Scala müssen Sie diese Konvertierung entweder manuell durchführen oder sich auf pimped Bibliotheken verlassen, um dies zu tun. –
@Dave Ja ... wenn der Typ nicht übereinstimmt, Auto-Cast. Ich denke, es sollte offensichtlich sein, warum Scala sich nicht so entschieden hat. –
Oh, sicher. Dies ist nur sinnvoll für Groovy und Java, da sie keine guten Möglichkeiten zur Erweiterung vorhandener Bibliotheken enthalten. Daher benötigen sie diese automatische Konvertierung, um das Arbeiten mit Java-Legacy nicht schmerzhaft zu machen. Scala hat Zuhälter für Legacy-Bibliotheken, und neue Bibliotheken sollten (und werden) geschrieben werden, um Funktionsformen gegenüber Single-Method-Interfaces zu bevorzugen. –