java之Collection、泛型
Collection
1、迭代器遍历
Iterator是接口,names.iterator返回的是实现类
集合当中是什么类型,迭代器取出就是什么类型
2、集合并发修改异常
迭代器取出对象(it.iterator())时会有一个记忆长度
3、泛型
不使用泛型,在运行时报类型转换失败,使用特定类型的方法时还需要强制类型转换。
使用泛型,将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
避免了类型强转的麻烦。
4、泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。
泛型写在类上:(泛型类)
创建对象时再确定E这个数据类型
泛型写在方法上:
调用show方法并传递参数的时候确定T这个数据类型,可以是String、Integer等。
泛型写在接口上:
//泛型接口
public interface MyInter<Q> {
public abstract void show(Q q);
}
//1.当子类实现接口的时候,确定接口上的泛型
class MyClass1 implements MyInter<String>{
@Override
public void show(String s) {
}
}
//2.当子类实现接口的时候,还是不确定泛型,把接口的泛型继续实现下来
//当实现类创建对象的时候确定
class MyClass2<Q> implements MyInter<Q>{
@Override
public void show(Q q) {
MyClass2<String> imp= new MyClass2<String>();//此时确定类型Q
}
}
通配符
/**
* 通配符:
* 正则表达式中"."代表任意字符
* 在DOS中"*"代表任意内容
* 泛型通配符:
* "?":代表任意类型
* <? extends Animal>: 表示一种泛型,
* 这种泛型必须是Animal或Animal的子类
* <? super Animal>: 表示一种泛型,
* 这种泛型必须是Animal或Animal的父类
*
* ArrayList中有一个方法
* addAll(Collection c);//把集合c里面的每一个元素添加到ArrayList中
*/
public class Generic {
public static void main(String[] args) {
ArrayList<String> names1 = new ArrayList<>();
names1.add("111");
names1.add("222");
ArrayList<String> names2 = new ArrayList<>();
names2.add("aaa");
names2.add("bbb");
ArrayList<Integer> names3 = new ArrayList<>();
names3.add(111);
names3.add(222);
//Collection<? extends String>
names1.addAll(names2);
names1.addAll(names3);//报错
System.out.println(names1);
}
}