泛型
泛型是JDK1.5之后出现的一种新技术
在没有泛型的时候,集合可以添加任意类型数据,但是在遍历集合的时候容易产生ClassCaseException类型转化异常
为了去解决这个问题,就产生了泛型这种技术
1.将运行期出现的异常提前到了编译期
2.不用再做类型转换的操作
泛型怎么使用?
*在所需要限定类型的时候 在后面加上<>,<>中填入要限定的类型
方法是一样的类似
方法可以限定传入参数的类型 function(Student s1,Teacher t1,int ,String)
*限定对象类型使用<> <e1,e2,e3...>
* 泛型的使用 :
* 1.泛型类
* 2.泛型方法
* 3.泛型接口..
* a.泛型的上限(使用场景比较多)
* ? extends E 只能接收E类型或者E的子类类型
* 使用场景 通常是做写(存储)的操作的时候,使用泛型的上限
* 比如说 Collection 中的 addAll(Collection<? extends E> c)
* 当前集合限定的泛型是Person类型
* 那这个集合中再去存储其他的集合,其他的集合的泛型就只能是Person类型或者其子类类型
*
* b.泛型的下限
* ? super E 只能接收E类型或者E的父类类型
* 使用场景 通常是做读(取出)的操作的时候,使用泛型的下限
* 比如说TreeSet中的构造函数中 TreeSet(Comparator<? super E> comparator)
* 在给TreeSet传入比较器的时候,比较器的泛型是当前TreeSet的泛型的父类类型
* TreeSet中只要是该父类类型下的任何子类都能使用该比较器,其他类就不能使用.
c.泛型的通配符 ?
* 使用场景 containsAll(Collection<?> c)
* removeAll(Collection<?> c)
* retainAll(Collection<?> c)
*
* 在判断集合中是否有该集合中的元素或者删除该集合中的元素 不需要明确类型,并且不需要拿该集合中的内容进行操作,有就删返回true,没有就不操作返回false
主要是为何要使用泛型
public static void main(String[] args) {
// 1 : "abc"
String[] arr = new String[]{};
ArrayList<String> list = new ArrayList<String>();
list.add("abc");
list.add("sss");
list.add("ddd");
// list.add(1);
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String value = it.next();
}
}
如果不使用泛型的话 如果是遍历同一集合的时候就会出现转换错误