Skip to content

Commit 6892ad4

Browse files
committed
Alignment with ResolvableType revision in master
1 parent 1d5128e commit 6892ad4

File tree

1 file changed

+111
-106
lines changed

1 file changed

+111
-106
lines changed

spring-core/src/main/java/org/springframework/core/ResolvableType.java

Lines changed: 111 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)