2026/3/28 11:38:53
网站建设
项目流程
怎么网站建设怎么样,网站顶一下代码,电影网站模板下载,网站模板的制作怎么做视频看了几百小时还迷糊#xff1f;关注我#xff0c;几分钟让你秒懂#xff01;#xff08;发点评论可以给博主加热度哦#xff09; 一、真实痛点#xff1a;没有泛型的世界有多痛苦#xff1f;
想象一下你在开发一个电商系统#xff0c;需要写一个通用的订单缓存工具…视频看了几百小时还迷糊关注我几分钟让你秒懂发点评论可以给博主加热度哦一、真实痛点没有泛型的世界有多痛苦想象一下你在开发一个电商系统需要写一个通用的订单缓存工具类// 没有泛型的写法Java 5 之前 public class OrderCache { private List orders new ArrayList(); // 存什么StringOrderUser public void add(Object order) { orders.add(order); } public Object get(int index) { return orders.get(index); } }使用时OrderCache cache new OrderCache(); cache.add(这不是订单); // 编译器不报错 cache.add(new User()); // 也能加 Order order (Order) cache.get(0); // 运行时 ClassCastException问题来了编译期无法检查类型安全强转容易出错代码可读性差别人根本不知道这个 list 到底存的是啥这就是泛型要解决的核心问题在编译期就保证类型安全二、什么是泛型一句话讲清楚泛型Generics就是“参数化类型”——把类型当作参数传进去让同一个类/方法能安全地处理多种数据类型。就像你买衣服不是固定 S/M/L而是“按你的尺码定制”。三、手把手实战用 Spring Boot 写一个泛型工具类场景我们要做一个通用的响应封装类既能返回用户信息也能返回订单列表。✅ 正确用法使用泛型// 通用响应体 public class ApiResponseT { private int code; private String message; private T data; // T 是泛型参数代表任意类型 public static T ApiResponseT success(T data) { ApiResponseT response new ApiResponse(); response.code 200; response.message success; response.data data; return response; } public static T ApiResponseT error(String msg) { ApiResponseT response new ApiResponse(); response.code 500; response.message msg; return response; } // getter/setter 略 }Controller 中使用RestController public class UserController { GetMapping(/user) public ApiResponseUser getUser() { User user new User(1L, 张三); return ApiResponse.success(user); // 自动推断 T 为 User } GetMapping(/orders) public ApiResponseListOrder getOrders() { ListOrder orders Arrays.asList( new Order(1L, U1001, new BigDecimal(99.9)) ); return ApiResponse.success(orders); // T 为 ListOrder } }✅优势编译器知道data是User或ListOrder不需要强转IDE 自动提示字段开发效率翻倍四、泛型的三种常见形式1. 泛型类Generic Classpublic class BoxT { private T content; public void set(T content) { this.content content; } public T get() { return content; } } // 使用 BoxString stringBox new Box(); stringBox.set(Hello); String s stringBox.get(); // 直接是 String无需强转2. 泛型方法Generic Methodpublic class Utils { // 方法级别的泛型与类无关 public static T void printList(ListT list) { for (T item : list) { System.out.println(item); } } } // 调用 Utils.printList(Arrays.asList(A, B)); // T String Utils.printList(Arrays.asList(1, 2, 3)); // T Integer3. 泛型接口Generic Interfacepublic interface RepositoryT { void save(T entity); T findById(Long id); } Service public class OrderRepository implements RepositoryOrder { Override public void save(Order order) { /* ... */ } Override public Order findById(Long id) { /* ... */ } } Spring Data JPA 的JpaRepositoryT, ID就是典型泛型接口五、反例警告这些错误你一定犯过❌ 反例 1用Object代替泛型// 错误示范 public class BadCache { private List data new ArrayList(); // raw type原始类型 public void add(Object obj) { data.add(obj); } public Object get(int i) { return data.get(i); } }⚠️ 编译器会警告Raw use of parameterized class List而且完全丧失类型安全❌ 反例 2泛型中使用基本类型Listint numbers new ArrayList(); // ❌ 编译错误✅ 正确写法用包装类ListInteger numbers new ArrayList(); // ✅❌ 反例 3运行时想获取泛型类型经典误区public class GenericDemoT { public void printType() { // 下面这行会报错 System.out.println(T.class); // ❌ 不合法 } }重要知识Java 泛型是编译期特性运行时会被“擦除”Type Erasure所以ListString和ListInteger在运行时都是List✅ 如果真需要运行时类型可通过传递 Class 对象解决public class TypedCacheT { private ClassT type; public TypedCache(ClassT type) { this.type type; } public T createInstance() throws Exception { return type.getDeclaredConstructor().newInstance(); } } // 使用 TypedCacheUser userCache new TypedCache(User.class); User user userCache.createInstance(); // 安全创建实例六、高级技巧泛型通配符?—— 灵活又安全场景写一个方法能打印任何类型的列表✅ 用上限通配符? extends Numberpublic void printNumbers(List? extends Number numbers) { for (Number n : numbers) { System.out.println(n.doubleValue()); } } // 可以传入 printNumbers(Arrays.asList(1, 2, 3)); // ListInteger printNumbers(Arrays.asList(1.5, 2.7)); // ListDouble✅ 用下限通配符? super Integerpublic void addIntegers(List? super Integer list) { list.add(100); // 可以添加 Integer list.add(200); } // 可以传入 ListNumber nums new ArrayList(); addIntegers(nums); // ✅ 因为 Number 是 Integer 的父类记忆口诀Producer extends生产者用extends只读Consumer super消费者用super只写七、Spring Boot 中泛型的典型应用1. RestTemplate 返回泛型结果ResponseEntityApiResponseUser response restTemplate.exchange( url, HttpMethod.GET, null, new ParameterizedTypeReferenceApiResponseUser() {} // 匿名子类保留泛型信息 );2. 自定义异常处理器ControllerAdvice public class GlobalExceptionHandler { ExceptionHandler(BusinessException.class) public ResponseEntityApiResponseVoid handleBusiness(BusinessException e) { return ResponseEntity.badRequest() .body(ApiResponse.error(e.getMessage())); } }八、总结泛型核心价值问题没有泛型有泛型类型安全运行时才报错编译期就拦截代码可读性不知道存的是啥一看就知道是ListOrder强转风险需要(Order) obj零强转复用性每个类型写一套一套代码通吃所有类型✅记住泛型不是“炫技”而是写出健壮、可维护代码的基本功视频看了几百小时还迷糊关注我几分钟让你秒懂发点评论可以给博主加热度哦