泛型
Java中的泛型是指在代码编写过程中,不指定具体的类型,在运行时再根据传递的参数确定具体的类型,从而实现代码的通用性和复用性。泛型可以应用于类、接口、方法等的定义中。
基础语法
Java中的泛型语法使用尖括号<>来定义泛型类型,在定义泛型类或接口时,在类名或接口名后面添加尖括号<>,其中可以定义一个或多个类型参数,类型参数可以是任意合法的标识符。
例如:
public class MyList<T> {
private T[] elements;
public T get(int index) {
return elements[index];
}
public void add(T element) {
// ...
}
}
这里,我们定义了一个泛型类 MyList,它有一个类型参数 T,用于表示列表中元素的类型。在这个类中,我们使用了泛型数组 T[] 来存储元素。同时,我们还定义了两个方法 get 和 add,它们分别用于获取和添加元素。
在实例化泛型类时,我们需要指定具体的类型参数。
例如:
MyList<String> list = new MyList<>();
这里我们实例化了一个 MyList 对象,并指定了类型参数为 String。这样,我们就可以往列表中添加字符串,并获取字符串了。
除了在类中定义泛型,我们还可以在方法中使用泛型。
例如:
public static <T> void printArray(T[] arr) {
for (T elem : arr) {
System.out.println(elem);
}
}
这里,我们定义了一个静态泛型方法 printArray,它接受一个泛型数组作为参数,并将数组中的元素依次打印出来。
使用时,我们需要在方法名前面的尖括号中指定类型参数:
String[] arr = {"Hello", "World"};
printArray(arr);
这样就可以将数组中的元素打印出来了。
需要注意的地方
- 泛型只能使用引用类型,不能使用基本类型;
- 泛型类型参数只存在于代码编译期间,在运行时会被擦除;
- 泛型类型参数不能用于静态变量或静态方法;
- 泛型类不能直接继承Exception或Throwable类。
泛型类和泛型方法的代码示例
public class MyList<T> {
private T[] elements;
private int size;
public MyList() {
elements = (T[]) new Object[10];
size = 0;
}
public void add(T element) {
if (size < elements.length) {
elements[size] = element;
size++;
}
}
public T get(int index) {
if (index >= 0 && index < size) {
return elements[index];
} else {
throw new IndexOutOfBoundsException();
}
}
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
}
可以看到,在MyList类中,使用T作为类型参数,表示可以接受任意类型的元素,然后使用T[]定义一个泛型数组,实现了一个简单的列表功能。同时,定义了一个静态的泛型方法printArray,可以打印任意类型的数组。