import javax.swing.JButton
import java.awt.event.ActionListener
import java.awt.event.ActionEvent
import javax.swing.JFrame
object Test {
/**
* 在Scala中,要某个函数做某件事时,会传一个函数参数给它。
* 而在Java中,并不支持传送参数。通常Java的实现方式是将动作放在一个实现某接口的类中,
* 然后将该类的一个实例传递给另一个方法。很多时候,这些接口只有单个抽象方法(single abstract method),
* 在Java中被称为SAM类型。
* @param args
*/
def main(args: Array[String]): Unit = {
var count = 0
val frame = new JFrame("SAM Testing")
val button = new JButton("Increment")
//java方式
// button.addActionListener(new ActionListener {
// override def actionPerformed(event: ActionEvent) {
// count += 1
// println(count)
// }
// })
/**
* scala方式: 隐式转换,将一种类型自动转换成另外一种类型,是个函数。
* 因为在Scala中,函数是头等公民,所以隐式转换的作用也大大放大了。
* 将这个函数和界面代码放在一起,就可以在所有预期ActionListener对象的地方,传入(ActionEvent)=>Unit函数参数。
* @param action
* @return
*/
implicit def makeAction(action: (ActionEvent) => Unit) =
new ActionListener {
override def actionPerformed(event: ActionEvent) { action(event) }
}
button.addActionListener((event: ActionEvent) => {count += 1; println(count)})
frame.setContentPane(button)
frame.pack()
frame.setVisible(true)
}
}
scala基础27-SAM转换
最新推荐文章于 2024-04-11 03:54:20 发布
这篇博客探讨了在Scala中如何使用SAM(Single Abstract Method)转换来简化与Java接口的交互。通过一个例子展示了如何在Scala中避免创建单独的ActionListener类,而是直接使用匿名函数进行事件处理,从而提高代码的简洁性。
摘要由CSDN通过智能技术生成