[英]Is there an elegant way to convert List<Double> into List<Number>?
我有一個函數,其參數是:
myFn(String, List<Number>, List<Number>)
調用函數有兩個List對象,我想用它作為函數的第二個和第三個參數。 我收到編譯錯誤:
The method myFn(String, List<Number>, List<Number>) in the type MyLib is not applicable for the arguments (String, List<Double>, List<Double>)
有沒有一種簡單的方法來克服這個問題? 有沒有一種簡單的方法可以將Double列表轉換為Number of List?
您不能將List<Double>
轉換為List<Number>
因為以下代碼會破壞List<Double>
List<Double> list = new List<Double>();
List<Number> list1 = list; // This does not work
list1.add(new Integer(0));
Double d = list.get(0);// Hu-hoh you received an Integer, not a Double!!
List<? extends Number> list2 = list; // This does work
你能做什么,就是改變
myFn(String, List<Number>, List<Number>)
至
myFn(String, List<? extends Number>, List<? extends Number>)
將myFn定義更改為<T extends Number> myFn(String, List<T>, List<T>, Class<T> type)
,您可以將其稱為myFn(String, List<Double>, List<Double>, Double.class)
如果您知道該方法不會修改該列表,請使用
List<Number> unmodifiableView = Collections.unmodifiableList(doubleList);
它以恆定時間運行並返回視圖。 它是完全類型安全,高效和合法的 - 只要您知道列表不會被修改。
如果你不能改變myFn
方法,那么作弊是一個選擇:
private <returntype> myFnAdapter(String s , List<Double> l1Double, List<Double> l2Double) {
// the following lines do create warnings
// it's safe, because all list items always extend Number.
List l1TypeErased = l1Double;
List<Number> l1Number = l1TypeErased;
List l2TypeErased = l2Double;
List<Number> l2Number = l2TypeErased;
return myFn(s, l1Number, l2Number);
}
你應該看到一些警告,就是這樣。 但是我們知道我們得到了Double
的列表,並且這些列表中的所有項都擴展了Number
,所以它不會在運行時引起麻煩。 只需添加注釋即可解釋類型擦除。 然后將所有值復制到新列表會更便宜。
您可以使用
myFn(String, List<? extends Number>, List<? extends Number>)
或者用你的功能打電話
myFn(String, (List) list1, (List) list2); // produces a warning.
你不能像這樣投射集合。 這個Java教程為您提供了完整的解釋。
作為一個解決方案,您在調用方法時只需創建一個以Double List作為參數的新List:
List<Double> doubleList = new ArrayList<Double>();
myFn(new ArrayList<Number>(doubleList));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.