@@ -123,27 +123,27 @@ public final class ResolvableType implements Serializable {
123123
124124
125125 /**
126- * Private constructor used to create a new {@link ResolvableType} for resolution purposes.
126+ * Private constructor used to create a new {@link ResolvableType} for cache key purposes.
127127 */
128- private ResolvableType (
129- Type type , TypeProvider typeProvider , VariableResolver variableResolver , ResolvableType componentType ) {
130-
128+ private ResolvableType (Type type , TypeProvider typeProvider , VariableResolver variableResolver ) {
131129 this .type = type ;
132130 this .typeProvider = typeProvider ;
133131 this .variableResolver = variableResolver ;
134- this .componentType = componentType ;
135- this .resolved = resolveClass () ;
132+ this .componentType = null ;
133+ this .resolved = null ;
136134 }
137135
138136 /**
139- * Private constructor used to create a new {@link ResolvableType} for cache key purposes.
137+ * Private constructor used to create a new {@link ResolvableType} for resolution purposes.
140138 */
141- private ResolvableType (Type type , TypeProvider typeProvider , VariableResolver variableResolver ) {
139+ private ResolvableType (
140+ Type type , TypeProvider typeProvider , VariableResolver variableResolver , ResolvableType componentType ) {
141+
142142 this .type = type ;
143143 this .typeProvider = typeProvider ;
144144 this .variableResolver = variableResolver ;
145- this .componentType = null ;
146- this .resolved = null ;
145+ this .componentType = componentType ;
146+ this .resolved = resolveClass () ;
147147 }
148148
149149
@@ -598,7 +598,7 @@ public ResolvableType[] getGenerics() {
598598 return EMPTY_TYPES_ARRAY ;
599599 }
600600 if (this .generics == null ) {
601- if (this .type instanceof Class <?> ) {
601+ if (this .type instanceof Class ) {
602602 Class <?> typeClass = (Class <?>) this .type ;
603603 this .generics = forTypes (SerializableTypeWrapper .forTypeParameters (typeClass ), this .variableResolver );
604604 }
@@ -691,7 +691,7 @@ public Class<?> resolve(Class<?> fallback) {
691691 }
692692
693693 private Class <?> resolveClass () {
694- if (this .type instanceof Class <?> || this .type == null ) {
694+ if (this .type instanceof Class || this .type == null ) {
695695 return (Class <?>) this .type ;
696696 }
697697 if (this .type instanceof GenericArrayType ) {
@@ -762,48 +762,20 @@ private ResolvableType resolveVariable(TypeVariable<?> variable) {
762762 return null ;
763763 }
764764
765- /**
766- * Return a String representation of this type in its fully resolved form
767- * (including any generic parameters).
768- */
769- @ Override
770- public String toString () {
771- if (isArray ()) {
772- return getComponentType () + "[]" ;
773- }
774- if (this .resolved == null ) {
775- return "?" ;
776- }
777- if (this .type instanceof TypeVariable ) {
778- TypeVariable <?> variable = (TypeVariable <?>) this .type ;
779- if (this .variableResolver == null || this .variableResolver .resolveVariable (variable ) == null ) {
780- // Don't bother with variable boundaries for toString()...
781- // Can cause infinite recursions in case of self-references
782- return "?" ;
783- }
784- }
785- StringBuilder result = new StringBuilder (this .resolved .getName ());
786- if (hasGenerics ()) {
787- result .append ('<' );
788- result .append (StringUtils .arrayToDelimitedString (getGenerics (), ", " ));
789- result .append ('>' );
790- }
791- return result .toString ();
792- }
793765
794766 @ Override
795- public boolean equals (Object obj ) {
796- if (this == obj ) {
767+ public boolean equals (Object other ) {
768+ if (this == other ) {
797769 return true ;
798770 }
799- if (!(obj instanceof ResolvableType )) {
771+ if (!(other instanceof ResolvableType )) {
800772 return false ;
801773 }
802- ResolvableType other = (ResolvableType ) obj ;
803- return (ObjectUtils .nullSafeEquals (this .type , other .type ) &&
804- ObjectUtils .nullSafeEquals (getSource (), other .getSource ()) &&
805- variableResolverSourceEquals (other .variableResolver ) &&
806- ObjectUtils .nullSafeEquals (this .componentType , other .componentType ));
774+ ResolvableType otherType = (ResolvableType ) other ;
775+ return (ObjectUtils .nullSafeEquals (this .type , otherType .type ) &&
776+ ObjectUtils .nullSafeEquals (getSource (), otherType .getSource ()) &&
777+ variableResolverSourceEquals (otherType .variableResolver ) &&
778+ ObjectUtils .nullSafeEquals (this .componentType , otherType .componentType ));
807779 }
808780
809781 @ Override
@@ -815,23 +787,6 @@ public int hashCode() {
815787 return hashCode ;
816788 }
817789
818- /**
819- * Custom serialization support for {@link #NONE}.
820- */
821- private Object readResolve () throws ObjectStreamException {
822- return (this .type == null ? NONE : this );
823- }
824-
825- /**
826- * Adapts this {@link ResolvableType} to a {@link VariableResolver}.
827- */
828- VariableResolver asVariableResolver () {
829- if (this == NONE ) {
830- return null ;
831- }
832- return new DefaultVariableResolver ();
833- }
834-
835790 private boolean variableResolverSourceEquals (VariableResolver other ) {
836791 if (this .variableResolver == null ) {
837792 return (other == null );
@@ -850,17 +805,59 @@ private int variableResolverSourceHashCode() {
850805 return hashCode ;
851806 }
852807
853- private static ResolvableType [] forTypes (Type [] types , VariableResolver owner ) {
854- ResolvableType [] result = new ResolvableType [types .length ];
855- for (int i = 0 ; i < types .length ; i ++) {
856- result [i ] = forType (types [i ], owner );
808+ /**
809+ * Adapts this {@link ResolvableType} to a {@link VariableResolver}.
810+ */
811+ VariableResolver asVariableResolver () {
812+ if (this == NONE ) {
813+ return null ;
857814 }
858- return result ;
815+ return new DefaultVariableResolver ();
816+ }
817+
818+ /**
819+ * Custom serialization support for {@link #NONE}.
820+ */
821+ private Object readResolve () throws ObjectStreamException {
822+ return (this .type == null ? NONE : this );
859823 }
860824
861825 /**
862- * Return a {@link ResolvableType} for the specified {@link Class}. For example
863- * {@code ResolvableType.forClass(MyArrayList.class)}.
826+ * Return a String representation of this type in its fully resolved form
827+ * (including any generic parameters).
828+ */
829+ @ Override
830+ public String toString () {
831+ if (isArray ()) {
832+ return getComponentType () + "[]" ;
833+ }
834+ if (this .resolved == null ) {
835+ return "?" ;
836+ }
837+ if (this .type instanceof TypeVariable ) {
838+ TypeVariable <?> variable = (TypeVariable <?>) this .type ;
839+ if (this .variableResolver == null || this .variableResolver .resolveVariable (variable ) == null ) {
840+ // Don't bother with variable boundaries for toString()...
841+ // Can cause infinite recursions in case of self-references
842+ return "?" ;
843+ }
844+ }
845+ StringBuilder result = new StringBuilder (this .resolved .getName ());
846+ if (hasGenerics ()) {
847+ result .append ('<' );
848+ result .append (StringUtils .arrayToDelimitedString (getGenerics (), ", " ));
849+ result .append ('>' );
850+ }
851+ return result .toString ();
852+ }
853+
854+
855+ // Factory methods
856+
857+ /**
858+ * Return a {@link ResolvableType} for the specified {@link Class},
859+ * using the full generic type information for assignability checks.
860+ * For example: {@code ResolvableType.forClass(MyArrayList.class)}.
864861 * @param sourceClass the source class (must not be {@code null}
865862 * @return a {@link ResolvableType} for the specified class
866863 * @see #forClass(Class, Class)
@@ -872,9 +869,9 @@ public static ResolvableType forClass(Class<?> sourceClass) {
872869 }
873870
874871 /**
875- * Return a {@link ResolvableType} for the specified {@link Class} with a given
876- * implementation. For example
877- * {@code ResolvableType.forClass(List.class, MyArrayList.class)}.
872+ * Return a {@link ResolvableType} for the specified {@link Class}
873+ * with a given implementation.
874+ * For example: {@code ResolvableType.forClass(List.class, MyArrayList.class)}.
878875 * @param sourceClass the source class (must not be {@code null}
879876 * @param implementationClass the implementation class
880877 * @return a {@link ResolvableType} for the specified class backed by the given
@@ -888,6 +885,38 @@ public static ResolvableType forClass(Class<?> sourceClass, Class<?> implementat
888885 return (asType == NONE ? forType (sourceClass ) : asType );
889886 }
890887
888+ /**
889+ * Return a {@link ResolvableType} for the specified {@link Class} with pre-declared generics.
890+ * @param sourceClass the source class
891+ * @param generics the generics of the class
892+ * @return a {@link ResolvableType} for the specific class and generics
893+ * @see #forClassWithGenerics(Class, ResolvableType...)
894+ */
895+ public static ResolvableType forClassWithGenerics (Class <?> sourceClass , Class <?>... generics ) {
896+ Assert .notNull (sourceClass , "Source class must not be null" );
897+ Assert .notNull (generics , "Generics must not be null" );
898+ ResolvableType [] resolvableGenerics = new ResolvableType [generics .length ];
899+ for (int i = 0 ; i < generics .length ; i ++) {
900+ resolvableGenerics [i ] = forClass (generics [i ]);
901+ }
902+ return forClassWithGenerics (sourceClass , resolvableGenerics );
903+ }
904+
905+ /**
906+ * Return a {@link ResolvableType} for the specified {@link Class} with pre-declared generics.
907+ * @param sourceClass the source class
908+ * @param generics the generics of the class
909+ * @return a {@link ResolvableType} for the specific class and generics
910+ * @see #forClassWithGenerics(Class, Class...)
911+ */
912+ public static ResolvableType forClassWithGenerics (Class <?> sourceClass , ResolvableType ... generics ) {
913+ Assert .notNull (sourceClass , "Source class must not be null" );
914+ Assert .notNull (generics , "Generics must not be null" );
915+ TypeVariable <?>[] variables = sourceClass .getTypeParameters ();
916+ Assert .isTrue (variables .length == generics .length , "Mismatched number of generics specified" );
917+ return forType (sourceClass , new TypeVariablesVariableResolver (variables , generics ));
918+ }
919+
891920 /**
892921 * Return a {@link ResolvableType} for the specified {@link Field}.
893922 * @param field the source field
@@ -1102,41 +1131,17 @@ public static ResolvableType forMethodParameter(MethodParameter methodParameter,
11021131 * @return a {@link ResolvableType} as an array of the specified component type
11031132 */
11041133 public static ResolvableType forArrayComponent (ResolvableType componentType ) {
1105- Assert .notNull (componentType , "ComponentType must not be null" );
1134+ Assert .notNull (componentType , "componentType must not be null" );
11061135 Class <?> arrayClass = Array .newInstance (componentType .resolve (), 0 ).getClass ();
11071136 return new ResolvableType (arrayClass , null , null , componentType );
11081137 }
11091138
1110- /**
1111- * Return a {@link ResolvableType} for the specified {@link Class} with pre-declared generics.
1112- * @param sourceClass the source class
1113- * @param generics the generics of the class
1114- * @return a {@link ResolvableType} for the specific class and generics
1115- * @see #forClassWithGenerics(Class, ResolvableType...)
1116- */
1117- public static ResolvableType forClassWithGenerics (Class <?> sourceClass , Class <?>... generics ) {
1118- Assert .notNull (sourceClass , "Source class must not be null" );
1119- Assert .notNull (generics , "Generics must not be null" );
1120- ResolvableType [] resolvableGenerics = new ResolvableType [generics .length ];
1121- for (int i = 0 ; i < generics .length ; i ++) {
1122- resolvableGenerics [i ] = forClass (generics [i ]);
1139+ private static ResolvableType [] forTypes (Type [] types , VariableResolver owner ) {
1140+ ResolvableType [] result = new ResolvableType [types .length ];
1141+ for (int i = 0 ; i < types .length ; i ++) {
1142+ result [i ] = forType (types [i ], owner );
11231143 }
1124- return forClassWithGenerics (sourceClass , resolvableGenerics );
1125- }
1126-
1127- /**
1128- * Return a {@link ResolvableType} for the specified {@link Class} with pre-declared generics.
1129- * @param sourceClass the source class
1130- * @param generics the generics of the class
1131- * @return a {@link ResolvableType} for the specific class and generics
1132- * @see #forClassWithGenerics(Class, Class...)
1133- */
1134- public static ResolvableType forClassWithGenerics (Class <?> sourceClass , ResolvableType ... generics ) {
1135- Assert .notNull (sourceClass , "Source class must not be null" );
1136- Assert .notNull (generics , "Generics must not be null" );
1137- TypeVariable <?>[] variables = sourceClass .getTypeParameters ();
1138- Assert .isTrue (variables .length == generics .length , "Mismatched number of generics specified" );
1139- return forType (sourceClass , new TypeVariablesVariableResolver (variables , generics ));
1144+ return result ;
11401145 }
11411146
11421147 /**
@@ -1198,7 +1203,7 @@ static ResolvableType forType(Type type, TypeProvider typeProvider, VariableReso
11981203
11991204 // For simple Class references, build the wrapper right away -
12001205 // no expensive resolution necessary, so not worth caching...
1201- if (type instanceof Class <?> ) {
1206+ if (type instanceof Class ) {
12021207 return new ResolvableType (type , typeProvider , variableResolver , null );
12031208 }
12041209
0 commit comments