泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。比如我们要写一个排序方法,能够对整型数组、字符串数组慎重其他任何类型的数组进行排序,我们就可以使用Java泛型。
类型通配符一般是使用?代替具体的类型参数,例如List<?>在逻辑上是List<String>,List<Integer>等所有List<具体类型实参>的父类。
1.泛型方法<E>
可以写一个泛型方法,该方法在调用是可以接受不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
<? entends T>表示该通配符所代表的类型是T类型的子类
<? super T>表示该通配符所代表的类型是T类型的父类
2.泛型类<T>
在类名后天就了类型参数声明部分,其他的和非泛型类相似。和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被成为一个类型变量,用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被成为参数化的类或参数化的类型。
3.类型擦除
Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉,这个过程就被称为类型擦除。
例如在代码中定义的List<Object>和List<String>等类型,在编译之后都会变成List。JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。
擦除的过程:找到用来体会类型参数的具体类,这个类一般是Object,如果指定了类型参数的上界的话,则使用这个上界,把代码中的类型参数都替换成具体的类。