簡體   English   中英

是否有一種優雅的方式來轉換List <Double> 進入清單 <Number> ?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM