A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

火炭

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 火炭 初级黑马   /  2014-12-26 22:57  /  1185 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一:数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以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>)
证明集合不是协变类型。

3 个回复

正序浏览
这是第几天的视频内容啊?
回复 使用道具 举报
这个问题可以通过指定泛型的上限和下限解决,public double totalArea(Collection<? extends Shape> arr)
这样就不会再报错了。喜欢技术的人点个赞!
回复 使用道具 举报
协变类型 是什麽。。。我去百度吧。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马