執行映射減少操作的通用方法。(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. javascript - webpack1和webpack2有什么區別?2. thinkPHP5中獲取數據庫數據后默認選中下拉框的值,傳遞到后臺消失不見。有圖有代碼,希望有人幫忙3. django - Python error: [Errno 99] Cannot assign requested address4. 求救一下,用新版的phpstudy,數據庫過段時間會消失是什么情況?5. python小白,關于函數問題6. javascript - vscode alt+shift+f 格式化js代碼,通不過eslint的代碼風格檢查怎么辦。。。7. python小白 關于類里面的方法獲取變量失敗的問題8. Python2中code.co_kwonlyargcount的等效寫法9. [python2]local variable referenced before assignment問題10. python - vscode 如何在控制臺輸入
