Java泛型
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
使用泛型可以避免了类型强转的麻烦
一、定义格式
修饰符 class 类名<代表泛型的变量> { }
二、集合中的泛型
//集合中的泛型
@Test
public void test_1(){
//没有泛型限定的集合,里面可以存储任何类型的对象引用
List list_1 = new ArrayList();
//存储了不同类型的数据,遍历的时候会出错
list_1.add("abc");
list_1.add(123);
//添加泛型的集合,里面只能存储泛型所限定类型的数据,保证了集合中数据类型的一致性和安全性
//以下定义的集合只能存储String类型的数据
List<String> list_2 = new ArrayList<String>();
list_2.add("abc");
//list_2.add(123); 这句代码编译会出错!!!
三、伪泛型
Java编译后的字节码文件中是没有泛型的,泛型是限定在编译的时候的安全机制,所以Java中的泛型称之为伪泛型。
四、泛型类、泛型方法
其实在上面集合演示的代码中,ArrayList就是一个泛型类,其定义如下:
public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, Serializable
以上类的定义中,就是泛型的限定,其中的字母E可以理解为一个变量,传过来什么类型,就是什么类型。
public class MyGenerics<E> {
private E e;
//泛型方法
public void add(E e) {
this.e = e;
}
//泛型方法
public E get() {
return e;
}
}
class Test{
public static void main(String[] args){
MyGenerics<String> mg_1 = new MyGenerics<>();
mg_1.add("abc");
mg_1.add("cde");
System.out.println(mg_1.get());
//mg_1.add(123); 这句代吗编译错误
}
}
五、泛型通配符
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符**<?>**表示。但是一旦使用泛型的通配
符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。