【发布时间】:2021-03-30 17:50:47
【问题描述】:
我正在尝试使用 lamdas 简化我的对象创建。
我有一个提供public void addCmd(ScriptCommand cmd)-方法的类。
有了这个我可以写一个这样的调用:
ScriptCommand cmd = new ScriptCommand() {
@Override
public void run(double deltaTime) {
// some logic here...
}
};
addCmd(cmd);
我已经尝试过这样调用:
ScriptCommand cmd = (deltaTime) -> {
// some logic here...
};
addCmd(cmd);
但是,这被 IDE 识别为错误。 在这种情况下如何使用 lambda?
编辑:
ScriptCommand 看起来像这样:
public abstract class ScriptCommand {
private boolean completed = false;
public abstract void run(double deltaTime);
protected void complete() {
completed = true;
}
public boolean isCompleted() {
return completed;
}
}
【问题讨论】:
-
什么是
ScriptCommand?我的猜测是它不是一个功能接口。您只能使用函数式接口(只有一种方法的接口)编写 lambda,否则编译器将不知道您正在尝试实现哪种方法,并且您最终会得到未实现的方法。 -
@CharlieArmstrong: "(只有一种方法的接口)" ... 功能接口实际上可以有任意数量的方法声明(几个例如,Java 平台库中的功能接口添加了辅助方法)。但是,必须正确的规定是功能接口 - 必须 - 有一个(并且只有一个)抽象方法。
-
@scottb 好点,我应该说“只有一种 abstract 方法。”
-
嘿 @CharlieArmstrong 和 scottb,我刚刚编辑了我的帖子并添加了 ScriptCommand.java 的结构。您能告诉我在最佳实践中我应该更改/添加哪些内容吗?
-
@MarcM 你不能让
ScriptCommand既是一个类又是一个接口。接口不能有字段(常量除外),因此如果您需要completed字段,您需要将其存储在另一个类中,或者坚持使用抽象类。