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,所以擦除类型后是同一个类了

   

 

posted @ 2022-02-23 17:51  高压锅里的大萝卜  阅读(39)  评论(0编辑  收藏  举报