为什么要引入泛型?
编译时更强大的类型检查。
如果代码违反类型安全性,则Java编译器将强类型检查应用于通用代码并发出错误。修复编译时错误比修复可能难以找到的运行时错误更容易。
消除类型转换,以及带来的拆装箱的操作。提高了程序的性能,编程更加容易。
使程序员能够实现通用算法
通过使用泛型,程序员可以实现对不同类型的集合进行工作的通用算法,可以自定义,并且类型安全且易于阅读。
什么是泛型
通俗来讲,泛型(通用类型)是一种将类型进行参数化的技术。参数化的意思,就是说让类型可根据传入的参数的值来发生动态变化。
易混概念
以下的名词说的都是一回事儿:
泛型=通用类型=类型参数化=参数化的类型=类型形参
注意区别:
1. 类型形参 不等于 形参
2. 类型通配符 不等于 泛型
有界限的泛型
设定类型形参的上限
其实,这个概念很简单。目的在于限制传入到类型形参中的实际类型,要么是上限类型,要么是该上限类型的子类。好处是:在泛型中能够充分利用面向对象中的多态的技术。使得在泛型中也能够使用协变的思想。
类型推断和菱形语法
什么是类型推断?其实,是为了简化咱们的编程复杂度,减轻程序员的编程工作。
它是Java编译器查看每个方法调用和相应声明的能力,以确定使调用适用的类型参数(或参数)。让推理算法确定参数的类型,如果可用,确定结果分配或返回的类型。最后,推理算法尝试找到适用于所有参数的最具体的类型。
例如:
class List {
static List nil() { ... };
static List cons(Z head, List tail) { ... };
E head() { ... }
}
//通过方法赋值的目标参数来自动推断泛型的类型
List l = List.nil();
//而不是显示的指定类型
//List l = List.nil();
//通过前面方法参数类型推断泛型的类型
List.cons(42, List.nil());
//而不是显示的指定类型
//List.cons(42, List.nil());
什么是菱形语法:
是JavaSE7之后,推出的新特性。其本质,也是和类型推断是一样的。它也是为了简化咱们的编程复杂度,减轻程序员的编程工作。
例如:
使用菱形语法前:
Map myMap = new HashMap();
使用菱形语法后:
Map myMap = new HashMap<>(); //注意后面的"<>"
泛型的实现原理
泛型和类型通配符
参考系列博客(三)
何时何地使用泛型?
如何使用泛型?