如何创建一个Java函数列表?

3

我希望能够从Java的Function创建一个列表。但是当我尝试将一个函数添加到functions列表时,它会显示;

Non-static variable cannot be referenced from a static context

我不知道哪个方法是静态的。有什么想法吗?

我的Main类:

public void createFunctionList() {
    List<Function> functions = new ArrayList<>();
    functions.add(Product::getInfo);
}

我的产品类:

public class Product 
{
    public Info getInfo() {
        return info;
    }
}

3
当你调用Product::getInfo时,你在引用Product类中的getInfo函数,而不是使用实例进行调用。因此,Java会期望getInfo是一个静态函数。 - vincrichaud
你是指Java的函数还是类的方法? - Drayke
1个回答

3

Product::getInfo 可以赋值给一个 Function<Product,Info> (因为它是一个非静态方法,所以可以看作是一个接受 Product 实例并返回 Info 实例的函数)。将 functions 的声明更改为

List<Function> functions = new ArrayList<>();

为了

List<Function<Product,Info>> functions = new ArrayList<>();

编辑:我测试了你的代码,结果得到一个不同的编译错误:

类型Product没有定义适用于此处的getInfo(Object)。

你得到的编译错误是误导性的。 一旦我进行建议的更改,错误就会消失。


我认为这并不能解决问题。getInfo 应该是静态的,以便使用 Product::getinfo 引用它。 - Héctor
@Héctor方法引用可以引用非静态方法。静态方法不适合“Function”接口,因为它将具有返回类型但没有输入参数。 - Eran
当它不是静态的时候,需要一个“this”引用。 - Héctor
@Héctor 不需要这个。只有在您想让方法引用指向类的特定实例时才需要使用 this - Eran
谢谢您的回答。但问题是我还需要添加其他功能,比如Supply::getInfo,Info::getAddress。是否有一种通用的方法来创建函数列表? - hellzone
2
@hellzone,你需要一个 List<Function<Object,Object>> 吗?这不是类型安全的。每个函数都期望特定类型的输入并产生特定类型的输出。如果你确实使用了 List<Function<Object,Object>>,你可以向其中添加函数,例如 functions.add(p -> ((Product)p).getInfo());,但这种强制转换是不安全的。 - Eran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接