执行映射减少操作的通用方法。(Java-8)
您所提出的示例与Java 8无关,与Java中泛型的工作原理无关。Function<T, Integer>function并将在编译时Function<T, Double>function进行类型擦除,并将其转换为Function。方法重载的经验法则是具有不同的数量,类型或参数顺序。由于这两种方法都将转换为采用Function参数,因此编译器会抱怨它。
话虽如此,srborlongan已经提供了一种解决该问题的方法。该解决方案的问题在于,您必须Test针对每种类型(整数,双精度等)上的每种类型的操作(加法,减法等)不断修改类。另一种解决方案是使用methodoverriding而不是method overloading:
Test如下更改类:
public abstract class Test<I,O extends Number> { List<I> list = new ArrayList<>(); public O performOperation(Function<I,O> function) {return list.stream().map(function).reduce((a,b)->operation(a,b)).get(); } public void add(I i) {list.add(i); } public abstract O operation(O a,O b);}
创建一个子类Test将添加两个Integer。
public class MapStringToIntAddtionoperation extends Test<String,Integer> { @Override public Integer operation(Integer a,Integer b) {return a+b; }}
然后,客户代码可以使用上述代码,如下所示:
public static void main(String []args) { Test<String,Integer> test = new MapStringToIntAddtionoperation(); test.add('1'); test.add('2'); System.out.println(test.performOperation(Integer::parseInt));}
使用这种方法的优点是您的Test班级符合该open-closed原则。要添加新的运算(如乘法),您要做的就是添加的新子类Test和将两个数字相乘override的operation方法。将其与Decorator模式结合使用,您甚至可以最小化必须创建的子类的数量。
此答案中的示例仅供参考。有很多改进的领域(例如使Test功能接口代替抽象类)超出了问题的范围。
解决方法如何在Java 8中使用泛型参数重载Function?
public class Test<T> { List<T> list = new ArrayList<>(); public int sum(Function<T,Integer> function) {return list.stream().map(function).reduce(Integer::sum).get(); } public double sum(Function<T,Double> function) {return list.stream().map(function).reduce(Double::sum).get(); }}
错误:java:名称冲突:sum(java.util.function.Function)和sum(java.util.function.Function)具有相同的擦除
相关文章:
1. 如何解决docker宿主机无法访问容器中的服务?2. 前端 - CSS3 box-shadow如何设置,或者用什么方法可以产生图中这样阴影的效果。3. node.js - vue-cll+sass 样式不出来 已经npm install sass、 sass-loader了4. html - css 如何让文字标题显示在边框上?5. docker 下面创建的IMAGE 他们的 ID 一样?这个是怎么回事????6. 在应用配置文件 app.php 中找不到’route_check_cache’配置项7. html按键开关如何提交我想需要的值到数据库8. vim中编辑HTML文件时换行不能缩进9. HTML5中怎么判断用户是否正在浏览页面?10. html - 微信端video标签播放mp4视频,安卓端提示视频解析错误
