Java面向对象编程-泛型#
泛型的作用:
泛型使得程序变得更加强壮,代码也跟房价精炼。Java语言支持泛型,但是在JVM中会擦除泛型
泛型的使用:
在集合声明和实现的后面加上<>,在里面写上指定的类型,这个集合就只能存放指定的元素类型了
语法格式:
List<String> blacklast = new ArrayList<String>();
指定泛型之后,如果存放其他类型,编译器就会报错;
下面以List和Map为例,展示在使用泛型后代码的变化
List:
package Demo01;
import java.util.ArrayList;
import java.util.List;
/**
* @version 1.0
* @author: jiazhihao
* @date: 2021-05-18 08:51
*/
public class Demo01 {
public static void main(String[] args) {
List<String> blacklist = new ArrayList<String>();
blacklist.add("张三");
blacklist.add("李四");
for (String string : blacklist) {
System.out.println("老赖" + string);
}
}
}
Map:
package Demo01;
import java.util.HashMap;
import java.util.Map;
/**
* @version 1.0
* @author: jiazhihao
* @date: 2021-05-18 08:54
*/
public class Demo02 {
public static void main(String[] args) {
Courier guo = new Courier("a1","小郭","男",22,"上海");
Courier mu = new Courier("a2","穆大姐","nv",28,"郑州");
Map<String,Courier> map = new HashMap<String,Courier>();
map.put(guo.getName(), guo);
map.put(mu.getName(), mu);
for (Map.Entry<String,Courier> entry:map.entrySet()){
System.out.println("姓名:"+entry.getKey() + "年龄:"+entry.getValue());
}
}
}
Map中循环总结:
- 增强了for循环使用方便,但性能较差,不适合处理超大量级的数据
- 迭代器的便利速度要比增强for循环块很多,是增强for循环的2被
- 使用entrySet 遍历的速度要比KeySet快很多,是KeySet的1.5倍左右
常见的泛型表示:
- E表示Element
- K表示Map的key
- V代表Map的value
- T代表Type
- 如果不清楚需要神魔类型,可以用问号嗲表类型。这在反射和方法继承时使用频繁
泛型接口和泛型方法
标准库中的集合都可以使用泛型,这样具有很高的通用性。当自己开发的类和接口也想使用泛型获得后的通用性,该怎么办?
代码;
public static String loophole(Integer x) {
List<String> ys = new LinkedList<String>();
List xs = ys;
xs.add(x);
return ys.iterator().next();
}
public static void main(String[] args) {
loophole(123);
}
可以看到,程序类型的转换异常,但是编译器却没有报错
这样的原因是,泛型是通过 java 编译器的称为擦除(erasure)的前端处理来实现的。你可以(基本上就是)把它认为是一个从源码到源码的转换,它把泛型版本的 loophole()转换成非泛型版本。 结果是,java 虚拟机的类型安全和稳定性决不能冒险,即使在又unchecked warning 的情况下。
擦除去掉了所有的泛型类型信息。所有在尖括号之间的类型信息都被扔掉了,因此,比如说一个 List类型被转换为 List。所有对类型变量的引用被替换成类型变量的上限(通常是 Object)