JDK1.5以后Java增加泛型支持,主要是让集合能够记住其元素的数据类型。另外增加了枚举类、反射等功能。在增加泛型(参数化类型parameterized type)前,如果将对象加入集合,集合就会把他们都当做Object类型处理,在从集合中取出元素时,需进行强制类型转换,这样不仅代码臃肿而且会把不该加入的对象加入到集合中,而且强转时容易出现ClassCastException异常。泛型的引入使其在编译时即检查集合元素的类型,如果不符合,则编译出错。可以自己扩展基本集合类实现泛型的功能。
定义泛型的接口和类:public interface List<E>{ void add(E e); Iterator<E> iterator();} public class Person<T>{private T t; public Person(){} public Person (T t){this.t = t;}}。调用该构造器时应该使用Person<T>的形参,并为其T形参传入实际的类型参数。可以从上述的接口和父类中派生子类或实现接口,可重写其方法,但是在继承和实现时必需指定T的类型。否则编译时将报警,可以通过命令增加-Xlint:unchecked选项看到详细信息,当A是B的子类或者子接口,而G是具有泛型声明的类或者接口,那么G<A>是G<B>的子类型并不成立,但数组A[]是B[]的子类型成立。Integer[] a = new Integer[5]; Number[] b = a; 如果是数组在编译时不会报错,运行时会报ArrayStoreException,而泛型在编译时就会报错。形参是List<?>、List<? extends shape>、public class A<T extends Number & java.io.Serializable>情况分析。
并不存在泛型类:list<String> a = new ArrayList<String>(); List<Integer> b = new ArrayList<Integer>(); System.out.println(a.getClass() == b.getClass());将输出true,因为泛型对其所有可能的类型参数,都具有同样的行为,从而可以把相同的类当成许多不同的类处理,与此完全一致的是,类的静态变量和方法也在所有实例间共享,所以不允许在静态变量的声明和初始化、静态方法、静态初始化中使用类型形参。由于系统中并不会真正的生成泛型类,所以instanceof运算符后不能使用泛型类,Collections m = new ArrayList<String(); if(m instanceof List<String>){...}编译错误。
泛型方法:修饰符<T,S> 返回值类型 方法名(形参列表){方法体} public static <T> T copy (Collection <? super T>dest, Collection<T> src),如果在一个类中同时存在public static <T> T copy (Collection <? super T>dest, Collection<T> src){...} public static <T> void copy (Collection <T>dest, Collection<? extends T> src){...},如果调用这两个方法将会出错,例如list<Number> a = new ArrayList<Number>(); list<Integer> a = new ArrayList<Integer>();copy(a,b)此时函数重载时将同时调用上面两种方法,只不过类型是Integer,Number。
擦除和转换:需要图示。
Java支持创建泛型数组:单独作为一节与小伙伴们共勉。
①null是所有引用类型的实例