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());