泛型一、泛型的概念二、泛型的语法1. 泛型类 / 接口2. 泛型方法三、泛型类的使用四、泛型如何编译的(面试常考)1. 擦除机制五、泛型的上界一、泛型的概念泛型就是参数化类型把数据类型当作参数传递把类型当作参数传进去用什么类型就指定什么类型代码更通用、更安全泛型 万能盒子你买一个盒子不规定它装什么。用的时候再说装苹果、装书、装玩具。泛型就是先不写死类型用的时候再指定二、泛型的语法1. 泛型类 / 接口class泛型类名称类型形参列表{// 这里可以使用类型参数}classClassNameT1,T2,...,Tn{} T 就是泛型参数表示任意类型T 可以是任意字母E、K、V、T 都可以2. 泛型方法publicTT方法名(Tt){returnt;}三、泛型类的使用示例// 泛型类T 代表传入的类型classBoxT{privateTdata;publicvoidset(Tdata){this.datadata;}publicTget(){returndata;}}使用publicclassTest{publicstaticvoidmain(String[]args){// 存字符串BoxStringbox1newBox();box1.set(Hello);Stringsbox1.get();// 存数字BoxIntegerbox2newBox();box2.set(100);intibox2.get();}}注意不能new泛型类型的数组比如说T[]tsnewT[5];泛型只能接受类所有的基本数据类型必须使用包装类四、泛型如何编译的(面试常考)1. 擦除机制通过命令javap -c 查看Box.class 字节码文件所有的T都是Object在编译的过程当中将所有的T替换为Object这种机制我们称为擦除机制Java的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息也就是说编译完成后生成 .class 文件时会把 全部删掉总结一下当你使用泛型时编辑器做了三件事编译期间类型检查比如你写了ArrayList String 编译器就只允许你 add String放错类型直接报错编译后擦除泛型 String 直接删掉变回原始类型Object自动帮你强转取数据时编译器偷偷帮你加 (String)五、泛型的上界在定义泛型类时有时需要对传入的类型变量做一定的约束可以通过类型边界来约束,限制传入的类型只能是某个类或它的子类语法class泛型类名称类型形参列表extends继承类/* 这里可以使用类型参数 */{// 这里可以使用类型参数}示例publicstaticvoidshow(BoxEextendsNumberbox){}上界 Number能传Integer、Double、Short……都是 Number 的子类不能传String、Student……不是子类复杂示例publicclassMyArrayEextendsComparableE{...}E必须是实现了Comparable接口的