题目
Java泛型基础概念与应用
信息
- 类型:问答
- 难度:⭐
考点
泛型概念理解, 类型安全优势, 泛型类定义
快速回答
Java泛型的主要作用是提供编译时类型安全检查并消除强制类型转换。核心优点包括:
- 类型安全:编译时检测类型错误
- 代码复用:一套逻辑处理多种数据类型
- 消除强制转换:减少ClassCastException风险
定义泛型类示例:
public class Box {
private T content;
public void set(T content) { this.content = content; }
public T get() { return content; }
}
## 解析
一、泛型核心原理
Java泛型本质是参数化类型(JDK5引入),在编译阶段进行类型检查,运行时进行类型擦除。例如List<String>在编译后变成原始类型List,但编译器会插入强制转换指令。
二、代码示例说明
泛型类定义:
// T为类型参数,使用时指定具体类型
public class Container<T> {
private T item;
public void store(T item) {
this.item = item; // 无需类型检查
}
public T retrieve() {
return item; // 直接返回正确类型
}
}
// 使用示例
Container<String> strContainer = new Container<>();
strContainer.store("Hello");
String value = strContainer.retrieve(); // 无强制转换三、类型安全优势
- 编译时错误检测:
List<String> list = new ArrayList<>(); list.add("abc"); list.add(123); // 编译错误!无法添加整数 - 避免运行时异常:非泛型代码可能抛出
ClassCastException,泛型在编译期拦截此类错误
四、最佳实践
- 优先使用泛型集合(如
List<String>而非原始List) - 方法返回泛型集合时避免返回
null,返回空集合更安全 - 类型参数命名惯例:
T(Type)、E(Element)、K(Key)、V(Value)
五、常见错误
- 原始类型(Raw Type):
Box rawBox = new Box(); // 警告!应指定类型参数 rawBox.set("test"); Integer num = (Integer) rawBox.get(); // 运行时ClassCastException - 混淆泛型与数组:不能创建泛型数组(如
new List<String>[10]非法)
六、扩展知识
- 类型擦除:泛型信息在编译后被擦除,
Box<String>和Box<Integer>运行时都是Box类型 - 通配符:
Box<?>表示未知类型,用于灵活读取(后续中级题目会深入) - 泛型方法:独立于类的类型参数
public <T> void printArray(T[] array) { for (T element : array) { System.out.println(element); } }