java泛型
一.泛型代码示意:
public interface List<E> extends Collection<E> {//泛型接口定义,接口名后面跟尖括号,尖括号里面的表示类型名称,相当于变量X那种感觉;泛型类和泛型接口定义格式一样 int size(); boolean isEmpty(); boolean contains(Object o); Iterator<E> iterator(); Object[] toArray(); <T> T[] toArray(T[] a);//泛型方法定义,方法最前面的尖括号<T>里的T,表示类型,相当于变量X boolean add(E e); boolean remove(Object o); boolean containsAll(Collection<?> c);//泛型使用,?是无限定通配符 boolean addAll(Collection<? extends E> c);//泛型使用,? extends E 是限定通配符,需要是E本身或者其子类 boolean addAll(int index, Collection<? super E> c);//泛型使用,? super E 是限定通配符,需要是E本身或者其父类 boolean removeAll(Collection<?> c); boolean retainAll(Collection<?> c); void clear(); boolean equals(Object o); int hashCode(); E get(int index); E set(int index, E element); void add(int index, E element); E remove(int index); int indexOf(Object o); int lastIndexOf(Object o); ListIterator<E> listIterator(); ListIterator<E> listIterator(int index); List<E> subList(int fromIndex, int toIndex); }
二.泛型类型擦除
下面代码执行结果是啥,为什么?
List<String> l1 = new ArrayList<String>(); List<Integer> l2 = new ArrayList<Integer>(); System.out.println(l1.getClass()== l2.getClass());
结果:
true
原因:
1.泛型只是在编译时其作用,用于检查类型错误
2.编译完成后class文件中,已经没有泛型信息了
3.所有的泛型类型(就是那个变量x)被统一转义成Object类型了
擦除后的类型变成以下样子:
public interface List extends Collection<Object> { int size(); boolean isEmpty(); boolean contains(Object o); Iterator<Object> iterator();//擦除类型,用Object替换 Object[] toArray(); Object[] toArray(Object[] a);//擦除类型,用Object替换 boolean add(Object e); boolean remove(Object o); }
4.类名字ArrayList<String>类型擦除后,变成ArrayList;ArrayList<Integer>类型擦除后,变成ArrayList,所以擦除类型后是同一个类了