1、介绍
泛型是 Java 5 引入的一种语言特性,主要用于在编译时增强代码的类型安全性。使用泛型可以为类、接口和方法提供类型参数,让它们在使用时能适应更多的类型。这样可以避免类型转换,并且可以提前在编译时捕获错误,而不是在运行时。
2、步骤
定义泛型类和接口
一个泛型类或接口的定义与非泛型版本类似,但是在类名后面添加了尖括号<>
,内部包含一个或多个类型参数。
public class Box<T> {
private T item;
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
使用泛型方法
可以在静态方法和非静态方法中使用泛型。类型参数出现在返回类型之前。
for (T element : array) {
System.out.print(element + " ");
}
System.out.println();
}
类型限定
可以使用 extends
关键字为泛型类型添加边界,这样只有某个类或是其子类可以作为类型参数。
public class BoxNumber<T extends Number> {
private T number;
public T getNumber() {
return number;
}
public void setNumber(T number) {
this.number = number;
}
}
使用通配符
有时候可能不关心使用的具体类型,但仍希望保证类型安全。这时可以使用通配符?
。
System.out.println(box.getItem());
}
完整的例子
public class GenericsExample {
public static void main(String[] args) {
Box<Integer> intBox = new Box<>();
intBox.setItem(42);
System.out.println("Integer Box: " + intBox.getItem());
Box<String> strBox = new Box<>();
strBox.setItem("Hello, Generics!");
System.out.println("String Box: " + strBox.getItem());
Integer[] intArray = {1, 2, 3, 4, 5};
printArray(intArray);
BoxNumber<Integer> boundedBox = new BoxNumber<>();
boundedBox.setNumber(101);
System.out.println("Bounded Box: " + boundedBox.getNumber());
}
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.print(element + " ");
}
System.out.println();
}
}
3、注意
-
类型擦除:Java 泛型在编译时进行类型检查,但类型信息在运行时被擦除。这是因为 Java 泛型是为了与之前版本的 Java 代码保持兼容性而设计的。
-
不能用于静态字段:由于类型擦除,不能将静态字段设置为泛型类型。
-
不能实例化参数化类型的数组:例如,
new T[10]
是非法的。 -
不支持基础类型:泛型只能用于对象类型,不能用于基础类型如
int
,char
等。