我正在阅读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;
}
}
我希望能帮助委内瑞拉人提出最好的问候。
答案 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()
。它解析为期望类型的实例,其功能接口方法实现为调用该构造函数。