我想计算任何整数或双精度集合的算术平均值。我定义了以下方法: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"); }为了测试该方法,我创建了一个双精度数组列表,如下所示: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;}但是当我像这样调用算术方法时:public static void main(String[] args) { System.out.println(arithmeticMean(dataSet)); System.out.println(arithmeticMean((Collection<Number>) dataSet));}第一次调用会导致错误:The method arithmeticMean(Collection<Number>) in the type SimpleStats is not applicable for the arguments (ArrayList<Double>)第二次调用会导致错误:Cannot cast from ArrayList<Double> to Collection<Number>在阅读了关于集合的Oracle Java教程部分之后,我不明白为什么我不能将ArrayList对象传递给需要集合的方法。ArrayList 继承自 Collection,Double 继承自 Number。有人可以解释一下吗?
2 回答
繁星点点滴滴
TA贡献1803条经验 获得超3个赞
通常,如果 是 的子类型(子类或子接口),并且是某种泛型类型声明,则不是 的子类型。这可能是你需要学习的关于泛型的最困难的事情,因为它违背了我们根深蒂固的直觉。
Foo
Bar
G
G<Foo>
G<Bar>
对于这种情况,您应该使用通配符,例如:Collection<? extends Number>
查看有关泛型、继承和子类型的详细信息
添加回答
举报
0/150
提交
取消