Java 8构造函数方法引用

时间:2014-10-21 23:13:05

标签: java java-8 method-reference constructor-reference

我正在阅读Java 8 book它带有一个我重现的样本..

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

执行者

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

来电者。

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

如果调用此方法,则打印到输出

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

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

如果我使用此代码

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

或者此代码

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

打印

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

Not exception or anything else is printed

我正在使用

非常感谢任何帮助
Java 8 1.8.25 64 bits.

更新

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

我创建了一个调用者类。

因为我需要实现一个空方法perform from the Action functional interface,我需要将其作为参数传递给类构造函数MethodReference我引用MethodReferenceCall which is a empty constructor and i can use it.

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

我希望能帮助委内瑞拉人提出最好的问候。

1 个答案:

答案 0 :(得分:9)

这个

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

不使用方法引用,它使用lambda表达式。功能界面是Action

public void perform();

所以

()->new ActionImpl()

被翻译成类似于

的东西
new Action() {
    public void perform () {
        new ActionImpl();
    }
}

同样,在

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

ActionImpl::new
使用构造函数引用的

被翻译成类似

的内容
new Action() {
    public void perform () {
        new ActionImpl();
    }
}

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