執(zhí)行映射減少操作的通用方法。(Java-8)
您所提出的示例與Java 8無(wú)關(guān),與Java中泛型的工作原理無(wú)關(guān)。Function<T, Integer>function并將在編譯時(shí)Function<T, Double>function進(jìn)行類(lèi)型擦除,并將其轉(zhuǎn)換為Function。方法重載的經(jīng)驗(yàn)法則是具有不同的數(shù)量,類(lèi)型或參數(shù)順序。由于這兩種方法都將轉(zhuǎn)換為采用Function參數(shù),因此編譯器會(huì)抱怨它。
話(huà)雖如此,srborlongan已經(jīng)提供了一種解決該問(wèn)題的方法。該解決方案的問(wèn)題在于,您必須Test針對(duì)每種類(lèi)型(整數(shù),雙精度等)上的每種類(lèi)型的操作(加法,減法等)不斷修改類(lèi)。另一種解決方案是使用methodoverriding而不是method overloading:
Test如下更改類(lèi):
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);}
創(chuàng)建一個(gè)子類(lèi)Test將添加兩個(gè)Integer。
public class MapStringToIntAddtionoperation extends Test<String,Integer> { @Override public Integer operation(Integer a,Integer b) {return a+b; }}
然后,客戶(hù)代碼可以使用上述代碼,如下所示:
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));}
使用這種方法的優(yōu)點(diǎn)是您的Test班級(jí)符合該open-closed原則。要添加新的運(yùn)算(如乘法),您要做的就是添加的新子類(lèi)Test和將兩個(gè)數(shù)字相乘override的operation方法。將其與Decorator模式結(jié)合使用,您甚至可以最小化必須創(chuàng)建的子類(lèi)的數(shù)量。
此答案中的示例僅供參考。有很多改進(jìn)的領(lǐng)域(例如使Test功能接口代替抽象類(lèi))超出了問(wèn)題的范圍。
解決方法如何在Java 8中使用泛型參數(shù)重載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(); }}
錯(cuò)誤:java:名稱(chēng)沖突:sum(java.util.function.Function)和sum(java.util.function.Function)具有相同的擦除
相關(guān)文章:
1. 在mac下出現(xiàn)了兩個(gè)docker環(huán)境2. html - sumlime text3代碼自動(dòng)補(bǔ)全功能問(wèn)題!3. web - css3 @keyframes用一次后面的任何樣式就解析不了了.4. javascript - 有一個(gè)異步獲取數(shù)據(jù)的函數(shù)A,其他依賴(lài)這個(gè)A得到的數(shù)據(jù)的函數(shù)是否都必須是異步的?5. css3 - 給body設(shè)置了translate3d,動(dòng)畫(huà)的同時(shí)導(dǎo)致內(nèi)部的fixed元素失效?6. node.js - win7 grunt不是內(nèi)部或外部命令。7. 想練支付寶對(duì)接和微信支付對(duì)接開(kāi)發(fā)(Java),好像個(gè)人不可以,怎么弄個(gè)企業(yè)的呢?8. node.js - 用node做微信開(kāi)發(fā)后臺(tái),獲取access_token報(bào)錯(cuò)9. css3 - 求css頁(yè)面解決方案10. javascript - 大神們,求救啊,搞百度編輯器,弄了三天了,問(wèn)題,如下
