📅  最后修改于: 2023-12-03 14:42:19.345000             🧑  作者: Mango
在 Java 中,泛型(Generics)是一种类型安全和重用代码的机制。通过使用泛型,可以在编译时检查类型,并在运行时避免类型转换错误。
在早期版本的 Java 中,集合类(如List、Set)只能存储 Object 类型的对象。这导致在使用集合时需要手动进行类型转换,这样容易引发类型转换错误,并且在编译时无法检测到错误。
使用泛型可以解决这个问题,它允许我们在定义集合类时指定集合中元素的类型,并且在编译时进行类型检查。这样可以提高代码的可读性和可维护性。
通过在类名后加上尖括号和类型参数,可以定义一个泛型类。
public class MyClass<T> {
private T value;
public MyClass(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
在上面的例子中,类名后面的 <T>
表示该类是一个泛型类,T
是类型参数。value
成员变量的类型和构造方法的参数类型都是 T
,表示根据实例化时传入的类型确定。
在使用泛型类时,可以通过指定类型参数的实际类型来创建对象。
MyClass<String> myObject = new MyClass<>("Hello");
String value = myObject.getValue();
在上面的例子中,我们创建了一个 MyClass
对象,将类型参数指定为 String
。之后就可以使用 String
类型的方法了。
除了可以定义泛型类,还可以定义泛型方法。泛型方法是在方法声明中使用类型参数的方法。
public <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
在上面的例子中,printArray
方法的类型参数是 <T>
,表示它是一个泛型方法。方法的参数是一个泛型数组 T[]
,可以接受任意类型的数组。在方法内部可以按类型参数 T
处理数组的元素。
有时候,我们希望泛型类或泛型方法能够接受多种类型的参数,可以使用通配符。
上界通配符用 extends
关键字表示,表示类型参数必须是指定类型的子类或本身。
public void printList(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num);
}
}
在上面的例子中,printList
方法接受一个 List
,该列表的元素类型必须是 Number
或其子类。
下界通配符用 super
关键字表示,表示类型参数必须是指定类型的父类或本身。
public void addToList(List<? super Integer> list) {
list.add(10);
}
在上面的例子中,addToList
方法接受一个 List
,该列表的元素类型必须是 Integer
或其父类。通过使用 add
方法将整数添加到列表中。
泛型是 Java 中一个重要的特性,它提供了类型安全和代码重用的机制。通过定义泛型类和泛型方法,我们可以根据实际需求指定类型参数,并且在编译时进行类型检查。同时,通配符的使用可以进一步扩展泛型的灵活性。
参考链接:Java 泛型