我想計算任何整數(shù)或雙精度集合的算術平均值。我定義了以下方法:public static double arithmeticMean(Collection<Number> collection) { for(Number element : collection) if (element.getClass().isInstance(Integer.class)) { Collection<Integer> intCollection = new ArrayList<>(); for(Number number : collection) intCollection.add(number.intValue()); return arithmeticMeanOfIntegers(intCollection); } else if (element.getClass().isInstance(Double.class)) { Collection<Double> doubleCollection = new ArrayList<>(); for(Number number : collection) doubleCollection.add(number.doubleValue()); return arithmeticMeanOfDoubles(doubleCollection); } throw new IllegalArgumentException("Method 'arithmeticMean' only operates on integer or double types"); }為了測試該方法,我創(chuàng)建了一個雙精度數(shù)組列表,如下所示:private static ArrayList<Double> dataSet = getDataSet();private static ArrayList<Double> getDataSet() { ArrayList<Double> dataSet = new ArrayList<>(); for(int i = 1; i < 21; i++) dataSet.add(new Double(i)); return dataSet;}但是當我像這樣調(diào)用算術方法時:public static void main(String[] args) { System.out.println(arithmeticMean(dataSet)); System.out.println(arithmeticMean((Collection<Number>) dataSet));}第一次調(diào)用會導致錯誤:The method arithmeticMean(Collection<Number>) in the type SimpleStats is not applicable for the arguments (ArrayList<Double>)第二次調(diào)用會導致錯誤:Cannot cast from ArrayList<Double> to Collection<Number>在閱讀了關于集合的Oracle Java教程部分之后,我不明白為什么我不能將ArrayList對象傳遞給需要集合的方法。ArrayList 繼承自 Collection,Double 繼承自 Number。有人可以解釋一下嗎?
2 回答

繁星點點滴滴
TA貢獻1803條經(jīng)驗 獲得超3個贊
通常,如果 是 的子類型(子類或子接口),并且是某種泛型類型聲明,則不是 的子類型。這可能是你需要學習的關于泛型的最困難的事情,因為它違背了我們根深蒂固的直覺。
Foo
Bar
G
G<Foo>
G<Bar>
對于這種情況,您應該使用通配符,例如:Collection<? extends Number>
查看有關泛型、繼承和子類型的詳細信息
添加回答
舉報
0/150
提交
取消