夯实Spring系列|第二十一章:Spring 泛型处理(Generic Resolution)

本文详细介绍了Spring框架中的泛型处理,包括Java泛型基础、类型接口、Spring泛型辅助类(如GenericTypeResolver和ResolvableType)的使用,以及泛型擦写和面试中常见的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

夯实Spring系列|第二十一章:Spring 泛型处理(Generic Resolution)

文章目录

本章说明

本章主要是介绍 Spring 中泛型的一些设计细节,以及一些关键 API 的使用。

1.项目环境

2.Java 泛型基础

泛型类型

  • 泛型类型是在类型上参数化的泛型类或者接口

泛型使用场景

  • 编译时强类型检查
  • 避免类型强转
  • 实现通用算法

泛型类型擦写

泛型被引入到 Java 语言中,以便在编译是提供更严格的类型检查并支持泛型编程。类型擦除确保不会为参数化类型创建新类;因此,泛型不会产生运行时开销。

为了实现泛型,编译器将类型擦除应用于:

  • 将泛型类型中的所有类型参数替换为其边界,如果类型参数是无边界的,则将其替换为 Object 。因此,生产的字节码只包含普通类、接口和方法
  • 必要时插入类型转换以保持类型安全
  • 生成桥接方法时以保留扩展泛型类型中的多态性
2.1 举例说明

集合场景

public interface Collection<E> extends Iterable<E> {
   
   
    ...
    boolean addAll(Collection<? extends E> c);
    ...
1234
  • <? extends E> 可以保证参数的边界,E 或者 E 的子类,同时也确保的了多态性
  • E 表示插入元素类型,做一个类型的约束
2.2 代码示例
public class GenericDemo {
   
   
    public static void main(String[] args) {
   
   
        // Java 7 Diamond 语法
        Collection<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");
        // 编译时错误
//        list.add(1);

        // 通过下面的方式可以欺骗编译器
        // 泛型擦写
        Collection temp = list;
        // 编译通过
        temp.add(1);

        System.out.println(list);
    }
}
123456789101112131415161718

3.Java 5 类型接口

Java 5 类型接口 - java.lang.reflect.Type

派生类或接口 说明
java.lang.Class Java 类 API,如 java.lang.String
java.lang.reflect.GenericArrayType 泛型数组类型
java.lang.reflect.ParameterizedType 泛型参数类型
java.lang.reflect.TypeVariable 泛型类型变量,Collection 中的 E
java.lang.reflect.WildcardType 泛型通配类型

Java 泛型反射 API

类型 API
泛型信息(Generics Info) java.lang.Class#getGenericInfo
泛型参数(Parameters) java.lang.reflect.ParameterizedType
泛型父类(Super Classes) java.lang.Class#getGenericSuperclass
泛型接口(Interfaces) java.lang.Class#getGenericInterfaces
泛型声明(Generics Declaration) java.lang.reflect.GenericDeclaration

API 使用示例

public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值