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,所以擦除类型后是同一个类了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构