1.泛型简介
泛型:< >,里面放一个用于接收具体引用数据类型的参数范围。
是jdk1.5出现的安全机制,用于编译时期。
好处:
1.将运行期间的问题ClassCastException转到了编译时期。
2.避免了强制转换的麻烦。
泛型的擦除:运行时,会将泛型去除,生成的class文件中是不带泛型的,主要是为了兼容运行的类加载器。
泛型的补偿:通过获取元素的类型(getClass)自动进行转换,不用使用者强制转换。
2.泛型类
当类中操作的引用数据类型不确定的时候,就用泛型表示。
格式:class+类名<类型>
class Student<T> {//泛型类定义
public void show(T t) {
System.out.println(t);
}
}
public class Demo {
public static void main(String[] args) {
Student<String> s = new Student<String>();
s.show("abc");
}
}
3.泛型方法
格式:修饰符+<类型>+函数返回类型+函数名()
class Student {
public <T> void show(T t) { //泛型方法定义
System.out.println(t);
}
}
public class Demo {
public static void main(String[] args) {
Student s = new Student();
s.show("abc");
}
}
4.泛型接口
将泛型定义在接口上
格式:
1.在定义类时接口类型明确:
interface 接口名<接口类型>
class + 类名 + implements + 接口名<接口类型>
interface Inter<T> {
public abstract void show(T t);
}
class InterImpl implements Inter<String> { //在定义类时已经 明确 接口类型
@Override
public void show(String s) {
System.out.println(s);
}
}
2.在定义类时接口类型不明确:
interface 接口名<接口类型T>
class + 类名<接口类型T> + implements + 接口名<接口类型T> ps:类型须保持一致
interface Inter<T> {
public void show(T t);
}
class InterImpl<T> implements Inter<T>{//在定义类时接口类型 不明确
public void show(T t) {
System.out.println(t);
}
}
5.泛型的上下限定:
上限:<? extends XXX>
下限:<? super XXX>
下述代码中,Dog是Animal的子类。
//只能接收Animal类对象
Collection<Animal> c1 = new ArrayList<Animal>();
Collection<Animal> c2 = new ArrayList<Dog>();//报错,因为泛型限定的类型不一致,
//就算后者是前者的子类也不行,必须前后都一致。
//只能接收Animal类对象或者其子类对象
Collection<? extends Animal> c3 = new ArrayList<Object>();//报错
Collection<? extends Animal> c4 = new ArrayList<Animal>();
Collection<? extends Animal> c5 = new ArrayList<Dog>();
//只能接受Dog类对象或其父类对象
Collection<? super Dog> c6 = new ArrayList<Object>();
Collection<? super Dog> c7 = new ArrayList<Animal>();
Collection<? super Dog> c8 = new ArrayList<Dog>();
Collection<? super Animal> c9 = new ArrayList<Dog>();//报错
5.1 上限的体现:
boolean addAll(Collection<? extends E> c)
按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾。
5.2 下限的体现:
TreeSet(Comparator<? super E> comparator)
构造一个新的,空的树集,根据指定的比较器进行排序。
5.3 通配符的体现:
boolean removeAll(Collection<?> c)
从此列表中删除指定集合中包含的所有元素。