Java中的多态函数调用?

时间:2012-03-05 03:45:12

标签: java interface event-handling polymorphism

是否可以在Java中以多态方式将函数传递给对象数组?

我正在尝试创建一个基于事件的系统,而界面并不像我希望的那样多样化。

因此,我希望能够将任何函数传递给事件管理器,并让它在下一次迭代时执行该函数。

4 个答案:

答案 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();
    }
});