【发布时间】:2016-06-29 02:34:46
【问题描述】:
我有一个enum 和一个为enum 值生成自定义字符串转换函数的方法:
public enum MyEnum {
DUMMY;
}
public <E extends Enum<E>> Function<E, String> stringify(String suffix) {
return enumValue -> enumValue.name() + suffix;
}
我想使用该方法为我的特定枚举类型制作一个函数:
public void test() {
Function<MyEnum, String> f = stringify("");
}
这行得通,但我还需要我的函数对字符串进行一些后续处理。举例来说,假设后续处理只是恒等函数:
public void test() {
Function<MyEnum, String> f = stringify("").andThen(Function.identity());
}
现在我得到一个编译错误。 Eclipse(霓虹灯) 说:
类型不匹配:无法从
Function<Enum<Enum<E>>,String>转换为Function<Test.MyEnum,String>
和javac 说:
error: incompatible types: no instance(s) of type variable(s) V,T#2 exist so that Function<E,V> conforms to Function<MyEnum,String>
Function<MyEnum, String> f = stringify("").andThen(Function.identity());
^
where V,R,T#1,T#2,E are type-variables:
V extends Object declared in method <V>andThen(Function<? super R,? extends V>)
R extends Object declared in interface Function
T#1 extends Object declared in interface Function
T#2 extends Object declared in method <T#2>identity()
E extends Enum<E>
Function.identity() 的返回类型与其参数类型相同,所以我看不出它如何将整体结果更改为 Function<MyEnum, String> 以外的其他值。 Eclipse 错误消息中的Enum<Enum<E>> 让我特别困惑。
我注意到我可以通过将中间结果分配给一个变量来避免这个问题:
public void test() {
Function<MyEnum, String> f1 = stringify("");
Function<MyEnum, String> f2 = f1.andThen(Function.identity());
}
但如果可能的话,我宁愿避免这种情况。
为什么会出现这种类型不匹配?最好的解决方法是什么?
【问题讨论】:
标签: java generics enums functional-programming