一、泛型概念与原理
泛型(Generics)是Java 5引入的一种新特性,允许在定义类、接口和方法时使用类型参数。泛型的主要目的是提高代码的复用性和类型安全。在编译阶段,编译器会检查泛型代码的类型正确性,从而避免了运行时类型转换错误。
二、泛型类型参数
泛型类型参数用于定义泛型类或接口。在定义泛型类或接口时,需要在类名或接口名后面添加尖括号(<>),并在尖括号内声明类型参数。例如:
public class Box<T> {
private T item;
public Box(T item) {
this.item = item;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
在这个例子中,T是一个泛型类型参数,表示Box类可以存储任意类型的对象。在使用Box类时,可以为T指定具体的类型,例如:
Box<Integer> intBox = new Box<>(123);
Box<String> stringBox = new Box<>("Hello, world!");
三、通配符类型参数
通配符类型参数用于表示任意类型,常用于泛型方法的参数类型。通配符使用问号(?)表示,例如:
public static void printItem(Box<?> box) {
System.out.println(box.getItem());
}
在这个例子中,printItem方法接受一个Box类型的参数,其中的类型参数使用了通配符。这意味着printItem方法可以处理任意类型的Box对象。需要注意的是,使用通配符类型参数时,不能对其进行修改操作(如添加、删除元素),因为具体类型未知。如果需要修改操作,可以使用有限制的通配符,例如:<? extends T>
或 <? super T>
。前者表示类型参数是T或T的子类,后者表示类型参数是T或T的父类。
四、泛型方法
与泛型类类似,Java也支持泛型方法。泛型方法可以在方法声明中定义类型参数。例如:
public static <T> void swap(List<T> list, int i, int j) {
T temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
在这个例子中,<T>
表示这是一个泛型方法,并且类型参数为T。通过使用泛型方法,我们可以轻松实现不同类型列表元素的交换。
五、自我理解
泛型让Java编程更加灵活和类型安全。它允许我们编写可以处理各种数据类型的代码,同时避免了重复和错误。就像有一个万能的盒子,我们可以放入各种物品,而且盒子还会确保放入的物品类型是正确的,这确实是一个非常强大的工具!