黑马程序员技术交流社区

标题: java数组和集合的协变区别 [打印本页]

作者: 火炭    时间: 2014-12-26 22:57
标题: java数组和集合的协变区别
一:数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以object形式来存储它们的元素。
二:一个数组实例具有固定的大小,不能伸缩。集合则可根据需要动态改变大小。
三:数组是一种可读/可写数据结构没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方 只读方式来使用集合。该方法将返回一个集合的只读版本。
ps:数组和集合还有一个区别,数组是协变类型,集合不是协变类型。
比如说:
           Person[] arr = new Employee[5];//Emplyee和Student都是Person子类
           arr[0] = new Student();//这里arr[0]实际上是一个Employee引用,但是Student不是Employee类型
这么做,不会报错,因为不存在类型转换。避免这种问题最简单的方法是指定这些数组不是类型兼容的,可是在java确是兼容的。
public double totalArea(Shape[] arr){
        double total = 0;
        for(Shape s: arr){
          if(s != null)
               total +=s.area();
        }
        return total;
}
public double totalArea(Collection<Shape> arr){
        double total = 0;
        for(Shape s: arr){
          if(s != null)
               total +=s.area();
        }
        return total;
}
这俩个方法第一个不会报错,第二个会抛出一个异常:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
        The method totalArea(Collection<Shape>) in the type Test is not applicable for the arguments (Collection<Square>)
证明集合不是协变类型。

作者: 找寻小龙猫    时间: 2014-12-26 23:17
协变类型 是什麽。。。我去百度吧。。
作者: 火炭    时间: 2014-12-27 10:07
这个问题可以通过指定泛型的上限和下限解决,public double totalArea(Collection<? extends Shape> arr)
这样就不会再报错了。喜欢技术的人点个赞!
作者: Jason996    时间: 2014-12-27 23:11
这是第几天的视频内容啊?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2