El intento de poner en práctica un código similar a la encontrada en el ejemplo de orden superior-función de http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-6Scala ActionListener/Tipo de función anónima desajuste
val button = new JButton("test")
button.addActionListener{ e:ActionEvent => println("test") }
add(button)
conduce a la siguiente
error: type mismatch;
found : (java.awt.event.ActionEvent) => Unit
required: java.awt.event.ActionListener
button.addActionListener{ e:ActionEvent => println("test") }
^
Esto es cierto a al menos con el compilador Scala versión 2.7.6.final en mi sistema. Puedo lograr lo que quiero en la forma del estilo Java de implementar explícitamente un ActionListener anónimo.
button.addActionListener(new ActionListener() {
def actionPerformed(e:ActionEvent) { println("test") }
})
Por lo que yo entiendo, Scala debe ser capaz de utilizar de pato a escribir para hacer esta implementación explícita de ActionListener innecesaria; Entonces, ¿por qué no funciona aquí? En este punto, casi no tengo ninguna experiencia práctica de tipado de patos.
No como fanboyismo, pero vale la pena señalar que tanto Groovy como las diversas propuestas de cierre de Java incluyeron conversiones implícitas de tipos de funciones apropiadas a interfaces de método único. Esto es muy conveniente para interfaces como Runnable o Comparable. En Scala, o necesita hacer esta conversión a mano, o recurrir a bibliotecas de pimped para hacerlo. –
@Dave Sí ... si el tipo no coincide, autoinélelo. Creo que debería ser obvio por qué Scala no eligió de esta manera. –
Oh, ciertamente. Solo tiene sentido para Groovy y Java porque no incluyen ninguna buena forma de extender las bibliotecas existentes, por lo que necesitan esta conversión automática para que el trabajo con Java heredado no sea doloroso. Scala tiene proxenetas para bibliotecas heredadas, y las nuevas bibliotecas deberían estar (y están siendo) escritas para favorecer formas funcionales sobre interfaces de método único. –