有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    您不能为方法模拟按引用传递,因为类似的事情可以使用接口,但对于对象,您可以模拟here

  2. # 2 楼答案

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

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

  3. # 3 楼答案

    (正如我写这篇文章时@Óscar Ló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"