Java 泛型
Java 泛型
泛型允许您编写能够处理不同数据类型的类、接口和方法,而无需预先指定确切的类型。
这使您的代码更加灵活、可重用且类型安全。
为什么要使用泛型?
- 代码可重用性: 只需编写一个类或方法即可处理不同的数据类型。
- 类型安全性: 在编译时捕获类型错误,而不是在运行时。
- 更简洁的代码: 获取对象时无需进行类型转换。
泛型类示例
您可以使用泛型创建一个能够处理不同数据类型的类:
class Box<T> {
T value; // T 是任何数据类型的占位符
void set(T value) {
this.value = value;
}
T get() {
return value;
}
}
public class Main {
public static void main(String[] args) {
// Create a Box to hold a String
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
System.out.println("Value: " + stringBox.get());
// Create a Box to hold an Integer
Box<Integer> intBox = new Box<>();
intBox.set(50);
System.out.println("Value: " + intBox.get());
}
}
T 是一个泛型类型参数。它就像数据类型的占位符。
- 当您创建一个
Box<String>时,T将变为String。 - 当您创建一个
Box<Integer>时,T将变为Integer。
这样,同一个类就可以用于不同的数据类型,而无需重写代码。
泛型方法示例
您还可以使用泛型创建适用于任何数据类型的方法:
public class Main {
// 通用方法:适用于任何类型 T
public static <T> void printArray(T[] array) {
for (T item : array) {
System.out.println(item);
}
}
public static void main(String[] args) {
// 字符串数组
String[] names = {"Jenny", "Liam"};
// 整数数组
Integer[] numbers = {1, 2, 3};
// 使用两个数组调用通用方法
printArray(names);
printArray(numbers);
}
}
示例详解
<T>是一个泛型类型参数——这意味着该方法可以处理任何类型:String、Integer、Double等。- 方法
printArray()接受一个T类型的数组,并打印每个元素。 - 调用该方法时,Java 会根据传入的参数确定
T的类型。
当您想编写一个方法来处理多种类型,而不是为每种类型重复编写代码时,这非常有用。
有界类型
您可以使用 extends 关键字来限制泛型类或方法可以接受的类型。
例如,您可以要求类型必须是 Number 的子类:
class Stats<T extends Number> {
T[] nums;
// 构造函数
Stats(T[] nums) {
this.nums = nums;
}
// 计算平均值
double average() {
double sum = 0;
for (T num : nums) {
sum += num.doubleValue();
}
return sum / nums.length;
}
}
public class Main {
public static void main(String[] args) {
// 与整数一起使用
Integer[] intNums = {10, 20, 30, 40};
Stats<Integer> intStats = new Stats<>(intNums);
System.out.println("Integer average: " + intStats.average());
// 与 Double 一起使用
Double[] doubleNums = {1.5, 2.5, 3.5};
Stats<Double> doubleStats = new Stats<>(doubleNums);
System.out.println("Double average: " + doubleStats.average());
}
}
尽管第一个例子中使用的是 int 值,但 .doubleValue() 方法会将它们转换为 double 值,因此结果会显示小数点。
示例详解
<T extends Number>:限制T只能处理Integer、Double或Float等数值类型。.doubleValue():将任何数字转换为double类型以进行计算。- 只要元素是
Number的子类,此方法就适用于任何数字数组。
泛型集合
Java 集合(例如 ArrayList 和 HashMap)内部都使用了泛型:
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
String fruit = list.get(0); // 无需强制转换
摘要
- 泛型使你的代码更灵活且类型安全。
- 使用
T或其他字母来定义类型占位符。 - 泛型可以应用于类、方法和接口。
- 使用边界来限制允许的类型。

