一、泛型概述

  • 泛型擦写

    • 边界泛型擦除
      • 无边界擦除使用Object 替换。
      • 有边界擦除使用第一绑定参数替换。
    • 必要时插入类型转换以保持类型安全(透明,虚拟机完成)
    • 生成桥接方法以保留扩展泛型类型中的多态性。(透明,虚拟机完成)

      二、Spring 泛型封装

      2.1 核心类 org.springframework.core.GenericTypeResolver

  • 处理类型(Type)相关方法

    • Class<?> resolveReturnType(Method method, Class<?> clazz)
    • Class<?> resolveTypeArgument(Class<?> clazz, Class<?> genericIfc)
  • 处理泛型参数类型(ParameterizedType) 相关方法
    • Class<?> resolveReturnTypeArgument(Method method, Class<?> genericIfc)
    • Class<?> resolveTypeArgument(Class<?> clazz, Class<?> genericIfc)
    • Class<?>[] resolveTypeArguments(Class<?> clazz, Class<?> genericIfc)
  • 处理泛型类型变量(TypeVariable)相关方法
    • Map<TypeVariable, Type> getTypeVariableMap(Class<?> clazz) ```java // #泛型参数 resolveTypeArgument public interface MyInterfaceType {} public class MySimpleInterfaceType implements MyInterfaceType {}

@Test void simpleInterfaceType() { assertThat(resolveTypeArgument(MySimpleInterfaceType.class, MyInterfaceType.class)).isEqualTo(String.class); }

// #泛型返回参数 resolveReturnTypeArgument public static class MyTypeWithMethods {

  1. public MyInterfaceType<Integer> integer() {
  2. return null;
  3. }

} assertThat(resolveReturnTypeArgument(findMethod(MyTypeWithMethods.class, “integer”), MyInterfaceType.class)).isEqualTo(Integer.class);

// #resolveType public static class MyTypeWithMethods { public void readIntegerInputMessage(MyInterfaceType message) {} public void readIntegerArrayInputMessage(MyInterfaceType[] message) {} public void readGenericArrayInputMessage(T[] message) {} } Method intArrMessageMethod = findMethod(MyTypeWithMethods.class, “readIntegerArrayInputMessage”, MyInterfaceType[].class); MethodParameter intArrMessageMethodParam = new MethodParameter(intArrMessageMethod, 0); assertThat(resolveType(intArrMessageMethodParam.getGenericParameterType(), new HashMap<>())).isEqualTo(MyInterfaceType[].class);

```

三、MethodParameter

封装了方法参数规范的Helper类,即方法或构造函数,以及参数索引和已声明泛型类型的嵌套类型索引。 用作传递的规范对象。
4.2版本开始,提供了一个org.springframework.core.annotation.SynthesizingMethodParameter子类,该子类用于合成具有属性别名的注解。 适用于Web消息终结点(message endpoint)处理。

3.1 元信息

  • 关联的方法: Method
  • 关联的构造器: Constructor
  • 构造器或方法参数索引: parameterIndex
  • 构造器或方法参数类型: parameterType
  • 构造器或方法参数泛型类型: genericParameterType
  • 构造器或方法参数类型名称: parameterName
  • 所在的类: containingClass
  • 3.2 设计

  • 表达参数类型(包含方法、构造器)

  • 表达返回值类型(Spring MVC)

    四、Spring4.0 泛型优化实现 ResolveableType

    ResolveableType 是作为GenericTypeResolverGenericCollectionTypeResolver的替代者,用心简化操作以及屏蔽复杂API
    可以将其API分类如下:

  • 工厂方法: for*

  • 转换方法: as*
  • 处理方法: resolve*

    4.1 示例

    4.2 局限性

  • 无法处理泛型擦写(JDK限制)

  • 无法处理非具体化的ParameterizedType

    五、扩展

    5.1 Java5 Type类型的派生类或接口

  • java.lang.Class

  • java.lang.reflect.GenericArrayType
  • java.lang.reflect.ParameterizedType
  • java.lang.reflect.TypeVariable
  • java.lang.reflect.WildcardType

    5.2 ResolvableType设计优势

  • 简化 Java5 Type API开发,屏蔽复杂 API运用,如 ParameterizedType

  • 不变性设计(Immutability)
  • Fluent API 设计 (Builder模式),链式(流式)编程