方法参考-无法从静态上下文中引用非静态方法

时间:2018-08-02 02:01:14

标签: java method-reference

我正在尝试创建供应商列表。我有实例方法getOne(),getTwo()的ClassA。然后在ClassB中,我有一种返回供应商列表的方法,如下所示:

public List<Supplier<String>> getData(){
    return Arrays.asList(
        ClassA::getOne,
        ClassA::getTwo
    );
}

我不能使方法静态。我实际上需要从其他类调用getData()。另一个类不知道从哪个类调用哪种方法。它只是从抽象类中调用getData()(在这种情况下,ClassA扩展了一些抽象类),然后迭代列表并调用这些方法。因此,另一个类可以从抽象类的任何实例中调用getData()

1 个答案:

答案 0 :(得分:5)

假设调用者类具有ClassA的实例,并且您想指定要调用的方法,则需要使用Function接受该实例并返回方法调用的结果。换句话说,您需要将返回类型更改为List<Function<ClassA, String>>。方法主体可以保持不变。要调用函数,您需要调用apply(),例如:

ClassA instance = ...
for (Function<ClassA, String> method : getData()) {
    String result = method.apply(instance);
    System.out.println(result);
}

或者,如@Thilo所指出的那样,您可以让该方法接受实例并返回在提供的实例上调用方法的供应商列表:

public List<Supplier<String>> getData(ClassA instance) {
    return Arrays.asList(
        instance::getOne,
        instance::getTwo
    );
}