题目
设计一个简单的泛型类
信息
- 类型:问答
- 难度:⭐
考点
泛型类定义,类型参数使用,类型安全
快速回答
实现一个泛型类 Box<T>,包含:
- 私有字段
content(类型为 T) - 带参数的构造方法
getContent()和setContent()方法- 在
main方法中分别用String和Integer类型测试
原理说明
泛型允许在定义类/接口/方法时使用类型参数,在实例化时指定具体类型。主要作用:
- 类型安全:编译时检查类型匹配,避免运行时
ClassCastException - 代码复用:一套逻辑处理多种数据类型
- 消除强制转换:编译器自动插入类型转换代码
代码示例
// 1. 定义泛型类
public class Box<T> {
private T content; // 类型参数T
public Box(T content) {
this.content = content;
}
public T getContent() {
return content;
}
public void setContent(T content) {
this.content = content;
}
// 2. 测试代码
public static void main(String[] args) {
// String类型实例
Box<String> stringBox = new Box<>("Hello");
System.out.println(stringBox.getContent().toUpperCase()); // 自动识别为String
// Integer类型实例
Box<Integer> intBox = new Box<>(100);
System.out.println(intBox.getContent() + 50); // 自动识别为Integer
// 类型错误示例(编译时报错)
// stringBox.setContent(123); // 错误: 不兼容的类型
}
}最佳实践
- 使用大写单字母命名类型参数(如
T,E,K,V) - 优先使用
new Box<>()钻石语法(Java 7+) - 避免使用原生类型(如
Box rawBox = new Box()),会失去类型安全
常见错误
- 类型不匹配:
Box<String> box = new Box<Integer>(10);(编译错误) - 基本类型限制:不能使用基本类型(如
Box<int>),需用包装类Box<Integer> - 静态成员误用:静态字段/方法不能使用类的类型参数
扩展知识
- 类型擦除:泛型在编译后会被替换为
Object(或边界类型),运行时无泛型信息 - 有界类型参数:
<T extends Number>限制 T 必须是 Number 子类 - 通配符:
Box<?>表示未知类型,常用于方法参数