我正在研究功能组合并有一个例子:
Function<String, String> test = (s) -> s.concat("foo");
String str = test.andThen(String::toUpperCase).apply("bar");
Run Code Online (Sandbox Code Playgroud)
该示例按预期编译并运行。但是,如果我使用 更改组合的顺序compose(),则需要显式转换:
String str = test.compose((Function <String, String>)
String::toUpperCase).apply("bar");
Run Code Online (Sandbox Code Playgroud)
如果没有显式转换String::toUpperCase为Function <String, String>,则会出现编译器错误:
Error:
incompatible types: cannot infer type-variable(s) V
(argument mismatch; invalid method reference
incompatible types: java.lang.Object cannot be converted to java.util.Locale)
String s = test.compose(String::toUpperCase).apply("bar");
^-------------------------------^
Run Code Online (Sandbox Code Playgroud)
问题是为什么compose()需要显式强制转换,而andThen()在这种情况下不需要?