面试题答案
一键面试选择非泛型类的情况
- 不需要类型参数化:当处理的数据类型固定,且不会因不同使用场景而改变时,使用非泛型类更简单直接。例如,一个专门处理整数的工具类,其功能只针对整数类型,无需泛型。
- 扩展性:在这种特定数据类型的场景下,扩展性局限于该类型相关功能的扩展,新增功能直接在类中添加方法即可。
- 兼容性:与旧版本Java代码兼容性好,无需考虑泛型类型擦除等问题,在只涉及固定类型交互的场景中使用方便。
- 与反射结合:反射操作简单,因为类型固定,获取字段、方法等操作无需处理泛型类型的复杂性。
- 性能优化:在某些对性能要求极高,且泛型的类型擦除可能带来额外开销的场景下,非泛型类可避免这些潜在开销。例如在一些底层高性能计算库中。
示例代码:
public class IntegerProcessor {
public int sum(int[] numbers) {
int result = 0;
for (int num : numbers) {
result += num;
}
return result;
}
}
选择泛型类的情况
- 需要处理多种数据类型:当框架需要以统一方式处理不同数据类型时,泛型类能提高代码复用性。例如,一个通用的栈数据结构,可以存储任何类型的数据。
- 扩展性:易于扩展以支持新的数据类型,只需在使用时指定具体类型参数,无需修改类的实现。
- 兼容性:与Java 5.0及之后版本兼容性良好,能很好地与其他泛型代码交互。但在与旧代码交互时可能需要考虑类型转换等问题。
- 与反射结合:反射操作会更复杂,因为需要处理泛型类型参数,如获取泛型方法的实际参数类型等。
- 增强类型安全性:泛型在编译期进行类型检查,可减少运行时类型转换错误。
示例代码:
public class GenericStack<T> {
private T[] elements;
private int top;
@SuppressWarnings("unchecked")
public GenericStack(int capacity) {
elements = (T[]) new Object[capacity];
top = -1;
}
public void push(T element) {
elements[++top] = element;
}
public T pop() {
if (top < 0) {
throw new RuntimeException("Stack is empty");
}
return elements[top--];
}
}