Java——通过反射了解集合泛型的本质
Java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译到了运行期就无效了。
下面通过一个实例来验证
/** * 集合泛型的本质 * @description * @author Trigl * @date 2016年4月2日上午2:54:11 */ public class GenericEssence { public static void main(String[] args) { List list1 = new ArrayList(); // 没有泛型 List<String> list2 = new ArrayList<String>(); // 有泛型 /* * 1.首先观察正常添加元素方式,在编译器检查泛型, * 这个时候如果list2添加int类型会报错 */ list2.add("hello"); // list2.add(20); // 报错!list2有泛型限制,只能添加String,添加int报错 System.out.println("list2的长度是:" + list2.size()); // 此时list2长度为1 /* * 2.然后通过反射添加元素方式,在运行期动态加载类,首先得到list1和list2 * 的类类型相同,然后再通过方法反射绕过编译器来调用add方法,看能否插入int * 型的元素 */ Class c1 = list1.getClass(); Class c2 = list2.getClass(); System.out.println(c1 == c2); // 结果:true,说明类类型完全相同 // 验证:我们可以通过方法的反射来给list2添加元素,这样可以绕过编译检查 try { Method m = c2.getMethod("add", Object.class); // 通过方法反射得到add方法 m.invoke(list2, 20); // 给list2添加一个int型的,上面显示在编译器是会报错的 System.out.println("list2的长度是:" + list2.size()); // 结果:2,说明list2长度增加了,并没有泛型检查 } catch (Exception e) { e.printStackTrace(); } /* * 综上可以看出,在编译器的时候,泛型会限制集合内元素类型保持一致,但是编译器结束进入 * 运行期以后,泛型就不再起作用了,即使是不同类型的元素也可以插入集合。 */ } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律