Java 泛型(Generics)是 Java 5 引入的重要特性,用于在编译期提供类型安全检查,避免强制类型转换,同时提高代码复用性。
下面从基础用法 → 常见场景 → 进阶用法系统讲一下。
泛型就是“参数化类型”:
类型也可以作为方法的参数
没有泛型时:
List list = new ArrayList();
list.add("abc");
String s = (String) list.get(0); // 需要强转,容易出错
有泛型后:
List<String> list = new ArrayList<>();
list.add("abc");
String s = list.get(0); // 安全、简洁
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");
String s = box.get();
public <T> T getFirst(T[] array) {
return array[0];
}
使用:
String s = getFirst(new String[]{"a", "b"});
Integer i = getFirst(new Integer[]{1, 2});
interface Repository<T> {
void save(T t);
T findById(int id);
}
实现:
class UserRepository implements Repository<User> {
public void save(User u) {}
public User findById(int id) { return null; }
}
?void printList(List<?> list) {
for (Object o : list) {
System.out.println(o);
}
}
? extends T只能读取,不能写入
void printNumbers(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
}
✅ 可接收:
List<Integer>
List<Double>
? super T可以写入,读取只能是 Object
void addNumbers(List<? super Integer> list) {
list.add(10);
}
✅ 可接收:
List<Integer>
List<Number>
List<Object>
T[] array = new T[10]; // 编译错误
✅ 解决方式:
T[] array = (T[]) new Object[10];
List<String> 和 List<Integer>
运行时是一样的
class Result<T> {
private int code;
private String msg;
private T data;
}
class BaseService<T> {
}
List<T>、Map<K,V>? extends / superCollections.sort)如果你愿意,我可以:
你现在是刚学 Java 还是准备面试?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。