Java 8构造函数方法引用



我正在读Java 8的书,它附带了一个我复制的示例:

@FunctionalInterface
public interface Action {
    public void perform();
}

一个实施者:

public final class ActionImpl implements Action {
    public ActionImpl() {
        System.out.println("constructor[ActionIMPL]");
    }
    @Override
    public void perform() {
        System.out.println("perform method is called..");
    }    
}

来电者:

public final class MethodReferences {
    private final Action action;
    public MethodReferences(Action action) {
        this.action = action;
    }
    public void execute() {
        System.out.println("execute->called");
        action.perform();
        System.out.println("execute->exist");
    }
    public static void main(String[] args) {
        MethodReferences clazz = new MethodReferences(new ActionImpl());
        clazz.execute();
    }
}

如果调用此命令,则将以下内容打印到输出中:

constructor[ActionIMPL]
execute->called
perform method is called..
execute->exist

一切都很好,但如果我使用方法引用而不是打印perform message方法!为什么,我是不是错过了什么?

如果我使用这个代码:

MethodReferences clazz = new MethodReferences(() -> new ActionImpl());
clazz.execute();

或者这个代码:

final MethodReferences clazz = new MethodReferences(ActionImpl::new);

这是打印出来的:

execute->called
constructor[ActionIMPL]
execute->exist

没有打印任何异常消息或其他内容。我使用的是Java 8 1.8.25 64位。

更新

对于像我这样学习的读者来说,这是正确的运行代码。

我已经创建了一个类调用者。

因为我需要实现一个空方法";从动作功能接口"执行";我需要将其作为参数传递给类构造函数CCD_ 2;作为空构造函数的MethodReferenceCall的构造函数";我可以用它。

public class MethodReferenceCall {
    public MethodReferenceCall() {
        System.out.println("MethodReferenceCall class constructor called");
    }
    public static void main(String[] args) {
        MethodReferenceCall clazz = new MethodReferenceCall();
        MethodReferences constructorCaller = new MethodReferences(MethodReferenceCall::new);
        constructorCaller.execute();
    }
}

MethodReferences clazz = new MethodReferences(() -> new ActionImpl());

不使用方法引用,而是使用lambda表达式。功能接口是Action

public void perform();

所以

() -> new ActionImpl()

被翻译成类似的东西

new Action() {
    public void perform() {
        new ActionImpl();
    }
}

类似地,在中

MethodReferences clazz = new MethodReferences(ActionImpl::new);

ActionImpl::new确实使用了构造函数引用,它被翻译成类似的东西

new Action() {
    public void perform() {
        new ActionImpl();
    }
}

ActionImpl::new不调用new ActionImpl()。它解析为期望类型的实例,该实例的函数接口方法通过调用该构造函数来实现。

相关内容

  • 没有找到相关文章

最新更新