问题描述
由于这是我的第一个问题,我希望这不会成为重复。 :D我发现类似的问题通常是关于Java 8之前的情况或缺少类型信息的情况。
我一直在研究一个小的库,以使使用java.util.function.*
接口,流和方法引用更加方便。不幸的是,有两种方法看起来很简单,但由于类型推断失败而无法有效地使用。
我应该事先说,我知道我可以通过显式指定类型来手动解决这些问题,但是这样做的目的是避免冗长。因此,这不算是解决方案。令人惊讶的是,需要像类型见证人这样的事实。
我希望能够做的一件事情是使用方法引用,就像它是功能接口的实例一样。例如,类似(Integer::parseInt).compose(String::toupperCase)
的东西。 (是的,没有意义的玩具示例。)
那么,为什么不创建一个可以用方法引用调用的方法并返回功能接口的实际实例呢?
public static <T,R> Function<T,R> fun(Function<T,R> f) {
return f;
}
这还应该有助于消除不同可能的接口之间的歧义,因为它会强制方法引用专门匹配Function
(而不是Consumer
)。
但是使用它所需的冗长性使该方法几乎无用,因为永远无法推断类型(T
和R
)。
以下是起作用的一些示例:
Function<String,Integer> f = fun(Integer::parseInt);
Function<String,String> g = fun(String::toupperCase);
int i = f.compose(g).apply("123");
var f = fun((String s) -> Integer.parseInt(s));
int i = Fun.<String,Integer>fun(Integer::parseInt)
.<String>compose(String::toupperCase)
.apply("123");
在前三个方法中,fun
方法毫无意义,因为我们可以执行Function<String,Integer> f = Integer::parseInt
等。最后一个方法太冗长而无用。
不幸的是,所有这些都失败了:
var f = fun(Integer::parseInt); // :(
int i = fun(Integer::parseInt).apply("123"); // :(
int j = fun(s -> Integer.parseInt(s)).apply("123"); // :(
Function<String,Integer> g = fun(Integer::parseInt)
.compose(String::toupperCase); // :(
在我看来,用于推断类型的上下文非常有限。有充分的理由吗?
换句话说,由于我不熟悉语言规范的技术细节,所以我想知道是否有某些深层原因导致这些事情无法像我期望的那样起作用。当然,如果有人偶然知道一些不错的(非冗长的)解决方法,那也很酷。
(顺便说一句,我已经在Java 15中尝试过此操作)。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)