📅  最后修改于: 2023-12-03 15:02:05.114000             🧑  作者: Mango
Java泛型是Java语言中一种强大的编程技术,用于在编译期对数据类型进行检查和处理。泛型使得程序员可以编写通用的代码,适用于多种数据类型,并避免了运行期错误。
泛型类是一种拥有一个或多个类型变量的类。类型变量规定了这个类可以作用于哪些数据类型。
public class Box<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
Box<Integer> box = new Box<Integer>();
box.set(10);
System.out.println(box.get());
在上面的例子中,Box类使用了一个类型变量T,表示一个占位符,可以代表任意类型。Box类可以被实例化为Box<Integer>类型的对象,其中类型变量T被类型Integer所代替。
泛型方法是一种可以在调用时指定类型的方法,可以在不同数据类型之间进行转换。
public <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
Integer[] intArray = {1, 2, 3, 4, 5};
String[] strArray = {"Hello", "World"};
printArray(intArray);
printArray(strArray);
在上面的例子中,printArray是一个泛型方法,可以接受任意类型的数组作为参数,并将数组元素输出到控制台。
泛型接口是一种接口,使用类型变量作为泛型类型参数。
public interface List<T> {
void add(T t);
T get(int index);
}
public class ArrayList<T> implements List<T> {
private T[] array;
private int size;
public ArrayList() {
array = (T[]) new Object[10];
size = 0;
}
public void add(T t) {
if (size >= array.length) {
T[] newArray = (T[]) new Object[array.length * 2];
System.arraycopy(array, 0, newArray, 0, array.length);
array = newArray;
}
array[size++] = t;
}
public T get(int index) {
return array[index];
}
}
在上面的例子中,List接口定义了一个泛型类型T,并提供了两个方法:add和get。ArrayList类实现了List接口,并使用类型变量T作为存储数据的类型。
通配符是一种表示任意类型的占位符,可以应用于泛型类、泛型方法和泛型接口中。
public void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
List<Integer> intList = Arrays.asList(1, 2, 3);
List<String> strList = Arrays.asList("Hello", "World");
printList(intList);
printList(strList);
在上面的例子中,printList方法接收一个List类型的参数,但该List的元素类型未知。可以将intList和strList作为参数传递给printList方法,并依次输出其中的元素。
Java SE 7及以上版本引入了菱形语法,可以根据左侧的泛型定义来推断右侧的类型参数。
List<String> strList = new ArrayList<>();
strList.add("Hello");
strList.add("World");
for (String str : strList) {
System.out.println(str);
}
在上面的例子中,使用ArrayList<>来实例化strList,并自动推断类型为String。
Java中的泛型是通过类型擦除实现的,在编译期间进行类型检查,在运行时将泛型类型擦除成原始类型。
public class Box<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
Box<Integer> box = new Box<Integer>();
System.out.println(box.getClass().getName()); // Box
在上面的例子中,使用getClass方法获取box对象的类名时,输出结果为Box,而不是Box<Integer>。这是因为在运行时,泛型类型已经被擦除成原始类型。
Java泛型是一种强大的编程技术,可以帮助程序员编写通用的代码,适用于多种数据类型。学好泛型对于成为一名优秀的Java程序员来说是非常重要的。