Java 用identity函数组合函数会导致类型不匹配
我有一个Java 用identity函数组合函数会导致类型不匹配,java,generics,enums,functional-programming,Java,Generics,Enums,Functional Programming,我有一个enum和一个为enum值生成自定义字符串转换函数的方法: public enum MyEnum { DUMMY; } public <E extends Enum<E>> Function<E, String> stringify(String suffix) { return enumValue -> enumValue.name() + suffix; } Function.identity()的返回类型与其参数类型相同,因此我
enum
和一个为enum
值生成自定义字符串转换函数的方法:
public enum MyEnum {
DUMMY;
}
public <E extends Enum<E>> Function<E, String> stringify(String suffix) {
return enumValue -> enumValue.name() + suffix;
}
Function.identity()
的返回类型与其参数类型相同,因此我看不出它如何将总体结果更改为Function
以外的内容。我对Eclipse错误消息中的Enum
感到特别困惑
我注意到,我可以通过将中间结果分配给变量来避免问题:
public void test() {
Function<MyEnum, String> f1 = stringify("");
Function<MyEnum, String> f2 = f1.andThen(Function.identity());
}
公共无效测试(){
函数f1=字符串化(“”);
函数f2=f1。然后(Function.identity());
}
但如果可能的话,我宁愿避免这样
为什么会出现这种类型的不匹配?解决这个问题的最佳方法是什么?这是一个泛型边界问题 在本声明中:
Function<MyEnum, String> f = stringify("").andThen(Function.identity());
请注意,这个
关键字也被添加了,因为您不能简单地编写stringify(“”
)
如果stringify(“”)
方法来自某个静态util类,则它将改为如下所示:
Function<MyEnum, String> f = MyUtils.<MyEnum>stringify("").andThen(Function.identity());
函数f=MyUtils.stringify(“”)。然后(Function.identity());
如果没有和第
调用,编译器会知道stringify(“”
的类型边界,因为它来自声明的f
类型。通过和第二个调用,stringify(“”
的结果不再直接分配给f
,但我认为编译器会识别进入的类型,然后必须与从中产生的类型相同。但听起来你是说类型推断不能像那样反向工作。我可能有点把你弄糊涂了。从的角度来看,推断出的类型,当没有显式地与类型绑定时,实际上是
。这正是您在stringify
方法中定义的。因此,在您的问题中,您实际上是将函数、字符串>
分配给函数
,这是不允许的。
public void test() {
Function<MyEnum, String> f1 = stringify("");
Function<MyEnum, String> f2 = f1.andThen(Function.identity());
}
Function<MyEnum, String> f = stringify("").andThen(Function.identity());
Function<MyEnum, String> f = this.<MyEnum>stringify("").andThen(Function.identity());
Function<MyEnum, String> f = MyUtils.<MyEnum>stringify("").andThen(Function.identity());