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

iPh*_*Dev -3 java method-reference

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

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

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

shm*_*sel 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 另一个替代方案(如果确实需要返回供应商列表)将是`getData`将`instance`作为参数并在本地捕获它.然后,退回的供应商将"记住"它.无论哪种方式,有人必须提供实例. (3认同)