泛型是Java中一个强大而灵活的特性,它允许你编写可重用的代码,同时增强了类型安全性。
泛型的主要目标是参数化类型,让你能够在类、接口和方法的定义中使用一个或多个类型参数,从而实现类型的参数化。这使得代码更具灵活性和重用性,而且编译器可以在编译时执行更严格的类型检查。
Java中的泛型使用尖括号(<>)来定义类型参数,并在需要的地方替换为实际的类型。以下是泛型的基本用法和语法:
1、定义泛型类
public class Box<T> {
private T data;
public Box(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
在这个例子中,Box
是一个泛型类,它有一个类型参数T
。在实例化时,你可以指定T
的具体类型,例如:Box<Integer>
,Box<String>
等。这样,data
字段和getData()
方法的返回类型将根据传入的类型参数而确定。
2、使用泛型类:
Box<Integer> integerBox = new Box<>(42);
int value = integerBox.getData(); // 这里不需要进行类型转换,编译器知道返回的是Integer类型
3、泛型方法:
public <T> T printAndGet(T[] array) {
for (T item : array) {
System.out.println(item);
}
return array[array.length - 1];
}
上述代码是一个泛型方法,它有一个类型参数T
。可以在调用该方法时指定实际类型,也可以让编译器根据参数类型进行推断。
4、限定类型参数:
有时候,若希望对泛型进行限制,确保它们满足某些条件。例如,你可以使用extends关键字来限定类型参数必须是某个类的子类或实现了某个接口:
public <T extends Number> double sumOfList(List<T> list) {
double sum = 0.0;
for (T element : list) {
sum += element.doubleValue();
}
return sum;
}
在这个例子中,我们使用<T extends Number>
来限定类型参数必须是Number类的子类。这样,我们可以确保在方法中使用doubleValue()
方法。
总之,Java中的泛型机制允许在创建类型参数化的类、接口和方法,提高代码的重用性和类型安全性。泛型为Java代码带来更多的灵活性,并在编译时提供更好的类型检查和错误提示。