理解 Java 泛型(Generics),可以从「是什么、为什么、怎么用、底层原理、常见坑」几个层面来看。
泛型是 JDK 5 引入的一种参数化类型机制,让类、接口、方法在定义时不指定具体类型,而是在使用时再指定。
List<String> list = new ArrayList<>();
这里的 <String> 就是泛型参数,表示“这个 List 只能装 String”。
在没有泛型之前:
List list = new ArrayList();
list.add("abc");
list.add(123); // 编译不报错
取出来时要强转,容易 ClassCastException。
泛型的好处:
class Box<T> {
private T value;
public void set(T value) { this.value = value; }
public T get() { return value; }
}
使用:
Box<String> box = new Box<>();
box.set("hello");
interface Repository<T> {
void save(T t);
}
public <T> T getFirst(List<T> list) {
return list.get(0);
}
?List<?> list; // 未知类型
? extends TList<? extends Number> list;
表示:只能是 Number 或其子类(如 Integer、Double)
✅ 适合 读取
? super TList<? super Integer> list;
表示:只能是 Integer 或其父类(如 Number、Object)
✅ 适合 写入
Java 泛型是 编译期机制(伪泛型),不是真正运行时的泛型。
叫:类型擦除(Type Erasure)
List<String> 和 List<Integer>
编译后都变成:
List
⚠️ 所以:
new T()T.classinstanceof TT[] arr = new T[10]; // ❌
List<int> ❌
List<Integer> ✅
class A<T> {
static T x; // ❌
}
Java 泛型 = 编译期类型安全 + 代码复用,本质是 类型擦除的参数化类型。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。