package com.test.fanxing;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class FanxingTest {
public static void main(String[] args) {
ArrayList list1 = new ArrayList();
ArrayList<String> list2 = new ArrayList<String>();
list2.add("hello");
// list2.add(10);//是错误的
Class c1 = list1.getClass();
Class c2 = list2.getClass();
System.out.println(c1==c2);
//反射的操作都是编译之后的操作
/*
* c1==c2结果返回true,说明编译之后集合的泛型是去泛型化的
* Java中集合的泛型,是防止错误输入的,只有在编译阶段有效,绕过编译就无效了
* 验证:我们可以通过方法的反射来操作,绕过编译
*
*/
try {
Method m = c2.getMethod("add", Object.class);
m.invoke(list2, 10);//绕过编译操作就饶过了泛型
System.out.println(list2.size());
System.out.println(list2);
// for (String string : list2) {
// System.out.println(string);
// }//现在不能这样遍历了(因为在list2中有String类型的也有int类型的值)
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
上边的这段代码分析:
<span style="font-size:18px;">ArrayList<String> list2 = new ArrayList<String>();
list2.add("hello");
// list2.add(10);//是错误的</span>
list2.add(10);在编译的时候会报错,因为ArrayList<String>集合已经有了String的泛型约束,集合的泛型约束的目的是防止错误输入的。
Class c1 = list1.getClass();
Class c2 = list2.getClass();
System.out.println(c1==c2);
首先因为反射的操作都是编译之后的操作,打印结果为true,表示c1==c2,说明编译之后集合的泛型是去泛型化的,集合的泛型只在编译阶段有效,绕过编译就无效了。就是说当编译完成后,集合的泛型约束就会消失。
Method m = c2.getMethod("add", Object.class);
m.invoke(list2, 10);//绕过编译操作就饶过了泛型
System.out.println(list2.size());
System.out.println(list2);
这段代码的目的是验证---》上边集合泛型只在编译阶段有效,绕过编译就无效了
方法的反射操作是编译之后的操作,是在运行时刻运行的,绕过了编译的过程
打印结果为:
2
[hello, 10]
正好证明了集合的泛型约束真的只是在编译阶段有效,绕过编译就无效了。
for (String string : list2) {
<span style="white-space:pre"> </span>System.out.println(string);
}
这段代码的运行结果为:
原因:
在list2集合中存在:[hello, 10],但是10并不是String类型的,int类型没法转换为String类型,所以会出现类转换异常。
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力...
全面总结Java泛型--实例
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...
Delphi泛型库--DGL(The Delphi Generic Library) 在Delphi中实现的类型安全、高效、易用的泛型容器和算法库;借鉴了C++标准中的STL;
补充知识:泛型1---马克-to-win java视频的详细描述与介绍
day02【Collection、泛型】-笔记.md
【Java基础】泛型方法 - 右撇子 - 博客频道 - CSDN.NET
泛型应用--图的深度(广度)优先遍历.成语接龙例
《数学与泛型编程-高效编程的奥秘》个人阅读笔记
个人制作且上课使用的课件,希望对大家初步了解泛型相关内容有一定的帮助。个人制作且上课使用的课件,希望对大家初步了解泛型相关内容有一定的帮助。
C++Primer第11章-泛型算法-课后习题答案[收集].pdf
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
补充知识2 ---马克-to-win java视频泛型的详细描述与介绍
JAVA设计模式--程序设计--反射--注解--泛型
数学和泛型编程-高效编程的奥秘(英文版pdf)原名:From_Mathematics_to_Generic_Programming,作者;Alexander A. Stepanov Daniel E. Rose
stl 泛型编程课程,值得学习,是百度网盘方式获取,,
复合型命令等等,对整个demo我写了一篇文章:https://www.jianshu.com/p/266794b9eda6 ,有兴趣的可以对照着文章进行查看demo,如需更多的设计模式的内容,可以留言,给大家分享整套系统的架构模式的学习资料.有很多是自己...
尚硅谷康师傅java学习笔记。 、2020-4-5 java学习笔记 2020-4-6 java笔记 ---内部类 2020-4-6 java笔记 ---异常 2020-4-6 java笔记 --多线程 2020-4-8 java笔记 String类 2020-4-9 java 比较器 2020-4-10 java笔记 ...
包含11个Word文档,包含了C#的集合、字符串和正则表达式、泛型、内存管理和指针、反射、线程和同步、.NET的安全性、COM的互相操作性、文件和注册表操作、使用GDI+画图、Windows Presentation Foundation。...