在Java中,泛型(Generics)是一种参数化类型的机制,它允许在定义类、接口和方法时使用类型参数,这些类型参数在使用时可以被指定为具体的类型。泛型的引入使得代码更加灵活,可以编写更通用、类型安全的代码。
主要特点和用途:
-
类型参数化:
- 泛型允许程序员在类或方法的声明中添加一个或多个类型参数,形如
<T>
、<E>
等。这些参数可以用来定义类的字段、方法的参数和返回值类型。
public class Box<T> { private T item; public void setItem(T item) { this.item = item; } public T getItem() { return item; } }
- 泛型允许程序员在类或方法的声明中添加一个或多个类型参数,形如
-
类型安全:
- 使用泛型可以在编译时提供更严格的类型检查,避免在运行时出现类型转换异常(ClassCastException)。
Box<String> stringBox = new Box<>(); stringBox.setItem("Hello"); // 类型安全,只能存放字符串 String item = stringBox.getItem(); // 类型安全,返回的是字符串
-
代码重用:
- 泛型使得类和方法更通用,可以用于不同类型的数据,从而提高代码的重用性。
Box<Integer> integerBox = new Box<>(); integerBox.setItem(123); // 类型安全,只能存放整数 Integer num = integerBox.getItem(); // 类型安全,返回的是整数
-
集合框架:
- Java集合框架(如
ArrayList
、HashMap
等)大量使用泛型,使得可以在不同集合中存储和操作特定类型的对象,同时保持类型安全。
List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); String fruit = list.get(0); // 类型安全,返回的是字符串
- Java集合框架(如
-
减少类型转换:
- 泛型减少了代码中的类型转换,使得代码更加简洁和可读。
泛型的工作原理:
-
类型擦除:
- Java中的泛型在编译后会被擦除(Type Erasure),即泛型类型信息只存在于编译阶段,编译器会将泛型代码转换为非泛型代码,使用类型转换和桥方法来保持兼容性。
-
通配符:
- 使用通配符
?
可以表示未知类型,用于某些情况下的灵活类型匹配。
public void printList(List<?> list) { for (Object obj : list) { System.out.println(obj); } }
- 使用通配符
泛型是Java中一个重要的特性,通过提供参数化类型的支持,使得代码更加灵活、类型安全和易于维护。