tij15_泛型
是
一句话概括:参数化类型。
意思是:在类、接口、方法中,有1个特殊的参数表示具体使用的类型。
why
为了更安全、更高效的复用代码。
泛型是JDK5引入的新特性,之前也可以用List(Object)实现泛华,但存在多个缺陷。改用泛型后,相对的优点:
1、在编译时检查类型,更安全。
不含泛型,加了不同类型的元素,后续使用有风险。
public static void noGeneric() {
ArrayList names = new ArrayList();
names.add("mikechen的互联网架构");
names.add(123); //编译正常
}
使用泛型,编译报错拦截。
public static void useGeneric() {
ArrayList<String> names = new ArrayList<>();
names.add("mikechen的互联网架构");
names.add(123); //编译不通过
}
2、消除了转换,更方便。因为编译时进行了类型经检查,后边使用时才不需要再强制转换,既麻烦、又不安全。
List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0);
3、避免了不必要的boxing、unboxing,更性能。
HOw
泛型类
泛型接口
泛型方法
泛型通配符
泛型的实现原理
泛型本质是将数据类型参数化,它通过擦除的方式来实现,即编译器会在编译期间「擦除」泛型语法并相应的做出一些类型转换动作。
我们定义了一个泛型类,定义了一个属性成员,该成员的类型是一个泛型类型,这个 T 具体是什么类型,我们也不知道,它只是用于限定类型的。
public class Caculate<T> {
private T num;
}
反编译一下这个 Caculate 类:
public class Caculate{
public Caculate(){}
private Object num;
}
发现编译器擦除 Caculate 类后面的两个尖括号,并且将 num 的类型定义为 Object 类型。
参考
[泛型详解(用例详实,讲解明白)] https://cloud.tencent.com/developer/article/2099089
【泛型常见面试问题(查漏补缺)】 https://www.imooc.com/article/372214#:~:text=Java%E6%B3%9B%E5%9E%8B%E8%AF%A6%E8%A7%A3%E5%8F%8A%E9%9D%A2%E8%AF%95%E9%97%AE%E9%A2%98%201%202.%20%E5%86%85%E9%83%A8%E5%B5%8C%E5%A5%97%E7%9A%84%E6%B3%9B%E5%9E%8B%E7%B1%BB%202%203.%20%E5%A4%9A%E9%87%8D%E8%BE%B9%E7%95%8C%203,%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%BB%AC%E5%9C%A8Java%E4%B8%AD%E4%B8%8D%E8%83%BD%E5%88%9B%E5%BB%BA%E6%B3%9B%E5%9E%8B%E6%95%B0%E7%BB%84%EF%BC%8C%E4%BE%8B%E5%A6%82%EF%BC%8CT%20%5B%5D%20array%20%3D%20new%20T%20%5B10%5D%3B%20%EF%BC%9F