为什么 Java 不使用 ArrayList<Double> 对象作为 Collection

我想计算任何整数或双精度集合的算术平均值。


我定义了以下方法:


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。


有人可以解释一下吗?


猛跑小猪
浏览 123回答 2
2回答

德玛西亚99

我还没有测试过这个,但我认为这是有效的。更改方法参数的类型:public&nbsp;static&nbsp;double&nbsp;arithmeticMean(Collection<Number>&nbsp;collection)&nbsp;{自public&nbsp;static&nbsp;double&nbsp;arithmeticMean(Collection<?&nbsp;extends&nbsp;Number>&nbsp;collection)&nbsp;{编辑:既然这样有效,请阅读什么是PECS的答案?它将帮助您更多地了解何时以及如何使用通用通配符。

繁星点点滴滴

从java教程:通常,如果 是 的子类型(子类或子接口),并且是某种泛型类型声明,则不是&nbsp;的子类型。这可能是你需要学习的关于泛型的最困难的事情,因为它违背了我们根深蒂固的直觉。FooBarGG<Foo>G<Bar>对于这种情况,您应该使用通配符,例如:Collection<? extends Number>查看有关泛型、继承和子类型的详细信息
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java