什么是泛型
泛型的本质是类型参数化,解决不确定对象类型的问题。泛型是在编译器增加一道检查,目的是促使程序员在使用泛型时安全放置和使用数据
泛型的好处
- 类型安全。避免ClassCastException
- 提升可读性。在编码阶段就显式的知道泛型集合、泛型方法等处理的对象是什么
- 代码重用。泛型合并了同类型的处理代码,使代码重用度变高
一个例子记住泛型概念
请查看下列代码是否会出现编译错误
public class Demo<T>{
static <String, T, Alibaba> String get(String string, Alibaba alibaba) {
return string;
}
public static void main(String[] args) {
Integer first = 222;
Long second = 3333L;
Integer result = get(first, second);
}
}
例子说明
当然不会出现编译错误,因为这里的String是参数,IDEA给了非常好的提示
关于泛型的几点理解
- 尖括号的位置非常讲究,只能出现在类之后和方法返回值之前
- 尖括号里的每一个元素都指代一种未知的类型
- 泛型在定义处只具备执行Object方法的能力
- 泛型只是一种编写代码的语法检查。对于编译后的字节码,没有这些花头花脑的方法签名,只有Object类型。这也就是类型擦除
泛型出现前
微波炉Stove可以加热多种食物,在没有泛型前只能用Object。
public class Stove{
public static Object heat(Object food) {
System.out.println(food+"加热完成");
return food;
}
public static void main(String[] args) {
Meat meat = new Meat();
meat = (Meat)Stove.heat(meat);
Soup soup = new Soup();
soup = (Soup) Stove.heat(soup);
}
}
泛型出现后
不再需要类型强制转换
public class Stove{
public static <T> T heat(T food) {
System.out.println(food+"加热完成");
return food;
}
public static void main(String[] args) {
Meat meat = new Meat();
meat = Stove.heat(meat);
Soup soup = new Soup();
soup = Stove.heat(soup);
}
}
备注
文章的例子来自《码出高效》