@@ -123,27 +123,27 @@ public final class ResolvableType implements Serializable {
123
123
124
124
125
125
/**
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.
127
127
*/
128
- private ResolvableType (
129
- Type type , TypeProvider typeProvider , VariableResolver variableResolver , ResolvableType componentType ) {
130
-
128
+ private ResolvableType (Type type , TypeProvider typeProvider , VariableResolver variableResolver ) {
131
129
this .type = type ;
132
130
this .typeProvider = typeProvider ;
133
131
this .variableResolver = variableResolver ;
134
- this .componentType = componentType ;
135
- this .resolved = resolveClass () ;
132
+ this .componentType = null ;
133
+ this .resolved = null ;
136
134
}
137
135
138
136
/**
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.
140
138
*/
141
- private ResolvableType (Type type , TypeProvider typeProvider , VariableResolver variableResolver ) {
139
+ private ResolvableType (
140
+ Type type , TypeProvider typeProvider , VariableResolver variableResolver , ResolvableType componentType ) {
141
+
142
142
this .type = type ;
143
143
this .typeProvider = typeProvider ;
144
144
this .variableResolver = variableResolver ;
145
- this .componentType = null ;
146
- this .resolved = null ;
145
+ this .componentType = componentType ;
146
+ this .resolved = resolveClass () ;
147
147
}
148
148
149
149
@@ -598,7 +598,7 @@ public ResolvableType[] getGenerics() {
598
598
return EMPTY_TYPES_ARRAY ;
599
599
}
600
600
if (this .generics == null ) {
601
- if (this .type instanceof Class <?> ) {
601
+ if (this .type instanceof Class ) {
602
602
Class <?> typeClass = (Class <?>) this .type ;
603
603
this .generics = forTypes (SerializableTypeWrapper .forTypeParameters (typeClass ), this .variableResolver );
604
604
}
@@ -691,7 +691,7 @@ public Class<?> resolve(Class<?> fallback) {
691
691
}
692
692
693
693
private Class <?> resolveClass () {
694
- if (this .type instanceof Class <?> || this .type == null ) {
694
+ if (this .type instanceof Class || this .type == null ) {
695
695
return (Class <?>) this .type ;
696
696
}
697
697
if (this .type instanceof GenericArrayType ) {
@@ -762,48 +762,20 @@ private ResolvableType resolveVariable(TypeVariable<?> variable) {
762
762
return null ;
763
763
}
764
764
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
- }
793
765
794
766
@ Override
795
- public boolean equals (Object obj ) {
796
- if (this == obj ) {
767
+ public boolean equals (Object other ) {
768
+ if (this == other ) {
797
769
return true ;
798
770
}
799
- if (!(obj instanceof ResolvableType )) {
771
+ if (!(other instanceof ResolvableType )) {
800
772
return false ;
801
773
}
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 ));
807
779
}
808
780
809
781
@ Override
@@ -815,23 +787,6 @@ public int hashCode() {
815
787
return hashCode ;
816
788
}
817
789
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
-
835
790
private boolean variableResolverSourceEquals (VariableResolver other ) {
836
791
if (this .variableResolver == null ) {
837
792
return (other == null );
@@ -850,17 +805,59 @@ private int variableResolverSourceHashCode() {
850
805
return hashCode ;
851
806
}
852
807
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 ;
857
814
}
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 );
859
823
}
860
824
861
825
/**
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)}.
864
861
* @param sourceClass the source class (must not be {@code null}
865
862
* @return a {@link ResolvableType} for the specified class
866
863
* @see #forClass(Class, Class)
@@ -872,9 +869,9 @@ public static ResolvableType forClass(Class<?> sourceClass) {
872
869
}
873
870
874
871
/**
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)}.
878
875
* @param sourceClass the source class (must not be {@code null}
879
876
* @param implementationClass the implementation class
880
877
* @return a {@link ResolvableType} for the specified class backed by the given
@@ -888,6 +885,38 @@ public static ResolvableType forClass(Class<?> sourceClass, Class<?> implementat
888
885
return (asType == NONE ? forType (sourceClass ) : asType );
889
886
}
890
887
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
+
891
920
/**
892
921
* Return a {@link ResolvableType} for the specified {@link Field}.
893
922
* @param field the source field
@@ -1102,41 +1131,17 @@ public static ResolvableType forMethodParameter(MethodParameter methodParameter,
1102
1131
* @return a {@link ResolvableType} as an array of the specified component type
1103
1132
*/
1104
1133
public static ResolvableType forArrayComponent (ResolvableType componentType ) {
1105
- Assert .notNull (componentType , "ComponentType must not be null" );
1134
+ Assert .notNull (componentType , "componentType must not be null" );
1106
1135
Class <?> arrayClass = Array .newInstance (componentType .resolve (), 0 ).getClass ();
1107
1136
return new ResolvableType (arrayClass , null , null , componentType );
1108
1137
}
1109
1138
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 );
1123
1143
}
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 ;
1140
1145
}
1141
1146
1142
1147
/**
@@ -1198,7 +1203,7 @@ static ResolvableType forType(Type type, TypeProvider typeProvider, VariableReso
1198
1203
1199
1204
// For simple Class references, build the wrapper right away -
1200
1205
// no expensive resolution necessary, so not worth caching...
1201
- if (type instanceof Class <?> ) {
1206
+ if (type instanceof Class ) {
1202
1207
return new ResolvableType (type , typeProvider , variableResolver , null );
1203
1208
}
1204
1209
0 commit comments