在Java中,有没有办法模仿lua和python中的第一类函数,比如这里?
def foo():
print "foo called"
bar = foo
bar() #output from this line is "foo called"
或者是在每种情况下使用不同方法的switch语句的唯一方法吗?
编辑:谢谢你的澄清,我的意思是有没有办法创建一个函数的引用,并将其称为函数。
另外,目标不是调用函数的某个实现,而是选择调用哪个函数,其中的选择可以完全不同。我想这样做的原因是有一个更通用的类,不需要编辑来添加功能。有点像将函数放入集合或列表中。
Edit2:任何查看此问题的人都是为了找到答案:这与堆栈和堆有关。 Java无法做到这一点,因为它的方法存储在堆栈上,这比堆硬得多。但是,Python将其函数存储在堆上,并在堆栈上引用它们。由于函数是通过python中的引用调用的,因此您可以更改对它们的引用并根据需要使用。
答案 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"