0

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

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

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

编辑:感谢您的澄清,我的意思是有没有办法创建对函数的引用,并像调用函数一样调用它。

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

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

4

3 回答 3

3

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

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

于 2013-09-30T19:21:37.837 回答
0

(As @Óscar López just posted as I was writing this) What you're doing is keeping a reference to a function and passing that around by value.

The "Java way" of doing this would be to use interfaces:

Interface:

public interface Printer {
    public void doPrint();
}

Implementation:

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

(Other implementations could be done - BarPrinter, BazPrinter, etc.)

Caller:

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"
于 2013-09-30T19:27:22.467 回答
0

您不能模拟方法的引用传递,对于类似的事情使用接口,但对于您可以在此处模拟的对象

于 2013-09-30T19:22:49.640 回答