gpt4 book ai didi

java - 尝试了解 Java 枚举中函数的用法

转载 作者:行者123 更新时间:2023-12-04 15:05:07 26 4
gpt4 key购买 nike

这是我的问题,为什么枚举需要对引用类的方法进行静态/接口(interface)访问才能工作?

这是我的带有接口(interface)的代码示例,我猜它可以工作,因为它是一个接口(interface),所以不是对对象实现的直接引用:

public interface PredicateBuilder<T extends Comparable> {

Predicate generateGreaterThan(PredicateContent<T> predicateContent);
...
}

然后我可以像这样在 Enum 中使用它:

public enum Condition {
GREATER_THAN(PredicateBuilder::generateGreaterThan, ">"),
...
public final String operator;
public final BiFunction<PredicateBuilder, PredicateContent<?>, Predicate> predicate;

private Condition(BiFunction<PredicateBuilder, PredicateContent<?>, Predicate> predicate, String operator) {
this.operator = operator;
this.predicate = predicate;
}
}

在那种情况下工作完美。

然后我尝试了以下方法:

@Component
public class SomeClass {
public String someMethod(String param){
return "Stuff";
}
/* This works
* public static String someMethod(String param){
* return "Stuff";
* }
*/

public void applyStuff(TestEnum enum,String param){
enum.action.apply(param)
}
public enum TestEnum{
OPTION_1(SomeClass::someMethod);
private Function<String,String> action;
private TestEnum(Function<String,String> action){
this.action = action;
}
}
}

此时 IDE 会提示,因为需要静态访问该方法,我更改为静态方法并且它可以工作。那么为什么会有这个限制呢?是因为枚举是静态的,所以它们只能访问静态/引用方法吗?

最佳答案

So why this limitation? Its because Enums are static so they only canaccess static/reference methods?

不,这是因为您在调用方法时没有实例化类 SomeClass 的实例。这导致了问题

Non-static method cannot be referenced from a static context

例如,以下将起作用:

public class SomeClass {

public String someMethod(String param){
return "Stuff";
}
}
public enum TestEnum{
OPTION_1(a -> new SomeClass().someMethod("something"));
private Function<String,String> action;
private TestEnum(Function<String,String> action){
this.action = action;
}
}
}

因为我们初始化了类 SomeClass 的对象( new SomeClass()),因此我们可以使用非静态方法。

如果您添加 SomeClass::someMethod,您就是在明确告诉编译器您想要来自类 SomeClass 的名为 someMethod 的静态方法。

关于java - 尝试了解 Java 枚举中函数的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66297890/

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