什么是泛型
泛型就是参数化类型,就是将类型由原来具体的类型参数化。
为什么要使用泛型:能够在不创建新类型(重新编写一个java.class)的情况下通过泛型指定的不同类型来控制形参具体限制的类型
Java中的泛型是一个伪泛型,类型擦除(java的泛型是在编译器这个层次上实现的)
(list<string>right,list<integer>left)java在编译期间所有的类型都会被擦除,生成的字节码不包含泛型的类型信息的。编译之后right和left都会变成class java.util.ArrayList;c++中的泛型是一个伪泛型
Left集合通过反射在运行时获得add方法能够添加字符串。
list.getClass().getMethod("add",Object.class).invoke(list,"abcd");
泛型的特性
1.先检查,后编译
2.不支持继承
3.不能是基本数据类型
4.泛型的类型参数不能是简单类型,只能是类类型
如果传递的是类类型能够正确的打印参数是什么
泛型类型在逻辑上可以看作是多个不同的类型,实际上都是相同的基本类型
如果传递的是简单类型,实际上打印的是一个地址
int数组被作为一个类型值传递,一旦传递的是一个简单类型,java就会认为整个的简单类型的数组当作一个类型值传递,不会认为简单类型数组中的123是传递的一个个数值
不要使用原始类型
原始类型:不去指定具体的类型
使用原始类型的场景: 将一些不同的数据类型封装成一个对象
使用原始类型的缺点: 如果需要在代码总做一些处理,可能会抛出运行时异
优化建议
- 初步优化:使用List<Object>至少告诉编译器,容器中存放任意类型的对象
- 更进一步优化:构建一个实体类例如People,将不同的数据类型作为它的一个个属性,明确的指定具体的类型,把类型检查的工作交给编译器来完成,List<People>