黑马程序员技术交流社区
标题:
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