gpt4 book ai didi

Java 8 - 构造函数引用 - Select 类型未定义适用于此处的 Select(DataObj)”

转载 作者:行者123 更新时间:2023-11-30 03:13:44 25 4
gpt4 key购买 nike

我定义了一个FunctionalInterface,如下所示:

@FunctionalInterface
public interface BaseAction {
public void execute(final DataObj dataObj) throws Exception;
}

然后,一个类实现如下:

public class Select implements BaseAction{

@Override
public void execute(final DataObj dataObj) {
//some operations on dataObj here..
}
}

当我尝试使用 Java 8 之前的语法实例化类 Select 时,为我进行编译,如下所示:

public BaseAction getAction(final String action) {      
switch (action) {
case "SELECT": return new Select(); //Works
}
return null;
}

但是,当我尝试使用 Java 8 语法实例化它时,IDE 开始提示我“Select 类型未定义适用于此处的 Select(DataObj)”,

public BaseAction getAction(final String action) {
switch (action) {
case "SELECT": return Select::new; //Compile error here..
}
return null;
}

知道如何修复它吗?

最佳答案

您使用的不是“用于创建对象的 Java 8 语法”。您正在使用对构造函数的引用,因此在某种程度上,两段代码之间的差异与 之间的差异相同

someObject.toString()

someObject.toString

第一个实例化一个新对象,第二个指向用于实例化新对象的事物,但不将其称为 (更精确的类比是 someObject::toString,顺便说一下)

如果您只想实例化一个 Select 对象,那么只需继续使用“旧”代码,这正是您在 Java 8 中执行此操作的方式。

如果您想要将要使用的特定构造函数传递给想要不知道使用哪个构造函数/类型的代码段,则新语法非常有用。

你可以这样做:

public void executeBaseAction(DataObject data, Supplier<BaseAction> baseActionSupplier) {
BaseAction action = baseActionSupplier.get();
action.execute(data);
}

并这样调用它:

executeBaseAction(data, Select::new);

关于Java 8 - 构造函数引用 - Select 类型未定义适用于此处的 Select(DataObj)”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33108243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com