这是我的问题,为什么枚举需要对引用类的方法进行静态/接口(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 can access 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/