Java模仿一流的功能

时间:2013-09-30 19:18:16

标签: java

在Java中,有没有办法模仿lua和python中的第一类函数,比如这里?

def foo():
    print "foo called"
bar = foo
bar()      #output from this line is "foo called"

或者是在每种情况下使用不同方法的switch语句的唯一方法吗?

编辑:谢谢你的澄清,我的意思是有没有办法创建一个函数的引用,并将其称为函数。

另外,目标不是调用函数的某个实现,而是选择调用哪个函数,其中的选择可以完全不同。我想这样做的原因是有一个更通用的类,不需要编辑来添加功能。有点像将函数放入集合或列表中。

Edit2:任何查看此问题的人都是为了找到答案:这与堆栈和堆有关。 Java无法做到这一点,因为它的方法存储在堆栈上,这比堆硬得多。但是,Python将其函数存储在堆上,并在堆栈上引用它们。由于函数是通过python中的引用调用的,因此您可以更改对它们的引用并根据需要使用。

3 个答案:

答案 0 :(得分:3)

问题中的代码演示传递引用行为。实际上,Java和Python都没有传递引用语义,它都是传值的。

您演示的是一阶函数:将函数视为任何其他值的能力。在Java 7及更早版本中,这是不可能的,尽管在Java 8中引入了匿名函数的新语法(称为 lambdas )。 lambda语法可用于模仿显示的行为。

答案 1 :(得分:0)

你无法模拟方法的参考传递,类似的东西使用接口,但对于你可以模拟的对象here

答案 2 :(得分:0)

(就像@ÓscarLópez在我写这篇文章时刚刚发布的那样)你正在做的是保持对函数的引用并按值传递它。

这样做的“Java方式”是使用接口:

接口:

public interface Printer {
    public void doPrint();
}

实现:

public class FooPrinter implements Printer {
    public void doPrint() { System.out.println("foo"); }
}

(可以完成其他实现 - BarPrinter,BazPrinter等)

呼叫者:

Printer p = new FooPrinter();
// presumably some other code here and
// probably p is passed to another function which accepts Printer (not FooPrinter)
p.doPrint(); // outputs "foo"