是否可以在Java中以多态方式将函数传递给对象数组?
我正在尝试创建一个基于事件的系统,而界面并不像我希望的那样多样化。
因此,我希望能够将任何函数传递给事件管理器,并让它在下一次迭代时执行该函数。
答案 0 :(得分:3)
我希望能够将任何功能传递给事件管理器
我们不是全部。不幸的是,Java没有第一类函数甚至函数指针。所以我们坚持使用接口和匿名类,至少在Java 8之前。
答案 1 :(得分:1)
为什么不让你的事件管理器执行Runnable
,并用一个方法调用你的方法调用? (这是Swing采取的方法。)
public class Foo {
public void doSomething(){
System.out.println("Hello");
}
}
EventQueue.doLater(new Runnable(){
public void run(){
new Foo().doSomething();
}
}
答案 2 :(得分:1)
我不确定为什么界面对你来说不够通用 - 你可以用接口做任何你喜欢的事情,当然也可以通过传递纯函数。
通常,您只需定义一个事件处理程序接口:
public interface EventHandler {
public ReturnType handle(ParamType param);
}
然后,您可以使用任意数量的不同处理程序类实现该接口。如果有用,处理程序对象甚至可以包含它们自己的状态。
然后可以多态地使用您定义的实现接口的任何内容,例如:存储在数组中,以便可以响应特定事件调用它们。
答案 3 :(得分:0)
Java不支持一流的功能。 但是你可以通过使用匿名类或使用EventHandler类来实现这一点。
这是来自Java Docs。
最简单的使用EventHandler是安装一个侦听器,该侦听器在没有参数的情况下调用目标对象上的方法。在下面的示例中,我们创建了一个ActionListener,它在javax.swing.JFrame的实例上调用toFront方法。
myButton.addActionListener(
(ActionListener)EventHandler.create(ActionListener.class, frame, "toFront"));
按下myButton时,将执行语句frame.toFront()。通过定义ActionListener接口的新实现并将其实例添加到按钮,可以获得相同的效果,并具有一些额外的编译时类型安全性:
//Equivalent code using an inner class instead of EventHandler.
myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
frame.toFront();
}
});