在 Java 中,泛型类是通过在类名后面加上 类型参数 来创建的。下面从基础到常见用法一步步说明。
// 定义一个泛型类
public class Box<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
使用方式:
Box<String> stringBox = new Box<>();
stringBox.setValue("Hello");
String s = stringBox.getValue();
Box<Integer> intBox = new Box<>();
intBox.setValue(100);
Integer i = intBox.getValue();
✅ T 只是一个占位符,使用时再指定具体类型。
public class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
}
使用方式:
Pair<String, Integer> pair = new Pair<>("age", 18);
new T()(不能实例化泛型)❌ 错误写法:
T obj = new T(); // 编译错误
✅ 正确做法(通过反射):
public class Box<T> {
private T value;
public Box(Class<T> clazz) throws Exception {
this.value = clazz.getDeclaredConstructor().newInstance();
}
}
❌ 错误:
private static T data; // 编译错误
✅ 静态方法可以自己定义泛型:
public static <T> T getDefault() {
return null;
}
// T 必须是 Number 或其子类
public class Calculator<T extends Number> {
public double add(T a, T b) {
return a.doubleValue() + b.doubleValue();
}
}
✅ 合法:
Calculator<Integer> c1 = new Calculator<>();
Calculator<Double> c2 = new Calculator<>();
❌ 不合法:
Calculator<String> c3 = new Calculator<>(); // 编译错误
Box<String> 和 Box<Integer> 运行时都是 Box| 普通类 | 泛型类 |
|---|---|
| 类型固定 | 类型灵活 |
| 不安全强制转换 | 编译期类型检查 |
| 重复写多个类 | 一个类适配多种类型 |
如果你愿意,我也可以给你讲:
你是在学 Java、C#,还是别的语言?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。