Java 泛型(Generics)是在 JDK 5 引入的,用来在编译期提供类型安全和代码复用。下面从「是什么、怎么用、底层原理、常见陷阱」几个角度说明。
泛型允许你在定义类、接口、方法时使用类型参数,在使用时再指定具体类型。
List<String> list = new ArrayList<>();
list.add("hello");
// list.add(123); // 编译错误
好处:
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("abc");
interface Repository<T> {
void save(T t);
}
public <T> T getFirst(List<T> list) {
return list.get(0);
}
List<? extends Number> list;
✅ 可读 Number
❌ 不能写(除 null)
List<? super Integer> list;
✅ 可写 Integer
❌ 读出来是 Object
List<?> list;
Java 泛型是编译期特性,运行时不存在泛型信息。
List<String> 和 List<Integer>
在 JVM 中都是:
List
编译器做了什么?
Object)示例:
class Box<T> {
T value;
}
编译后等价于:
class Box {
Object value;
}
class A implements Comparable<String> {
public int compareTo(String s) { ... }
}
编译器生成:
public int compareTo(Object o) {
return compareTo((String) o);
}
new T()T obj = new T(); // 编译错误
List<int> // ❌
List<Integer> // ✅
T[] arr = new T[10]; // ❌
if (obj instanceof List<String>) // ❌
List<String> 和 List<Integer> 字节码相同如果你愿意,我可以:
你想从哪方面深入?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。