为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

猛跑小猪 2022-08-03 10:16:31
我想计算任何整数或双精度集合的算术平均值。我定义了以下方法: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 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

我还没有测试过这个,但我认为这是有效的。更改方法参数的类型:

public static double arithmeticMean(Collection<Number> collection) {

public static double arithmeticMean(Collection<? extends Number> collection) {

编辑:既然这样有效,请阅读什么是PECS的答案?它将帮助您更多地了解何时以及如何使用通用通配符。


查看完整回答
反对 回复 2022-08-03
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

java教程:

通常,如果 是 的子类型(子类或子接口),并且是某种泛型类型声明,则不是 的子类型。这可能是你需要学习的关于泛型的最困难的事情,因为它违背了我们根深蒂固的直觉。FooBarGG<Foo>G<Bar>

对于这种情况,您应该使用通配符,例如:Collection<? extends Number>

查看有关泛型、继承和子类型的详细信息


查看完整回答
反对 回复 2022-08-03
  • 2 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信