Skip to content

Commit 7cf124b

Browse files
committed
Revert "Support WildcardType resolution in GenericTypeResolver"
This reverts commit f075120. See spring-projectsgh-22313 See spring-projectsgh-31690
1 parent 35fcbae commit 7cf124b

File tree

2 files changed

+18
-107
lines changed

2 files changed

+18
-107
lines changed

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

+17-39
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
* @author Rob Harrop
4040
* @author Sam Brannen
4141
* @author Phillip Webb
42-
* @author Sebastien Deleuze
4342
* @since 2.5.2
4443
*/
4544
public final class GenericTypeResolver {
@@ -167,30 +166,29 @@ public static Type resolveType(Type genericType, @Nullable Class<?> contextClass
167166
}
168167
else if (genericType instanceof ParameterizedType parameterizedType) {
169168
ResolvableType resolvedType = ResolvableType.forType(genericType);
170-
Class<?>[] generics = new Class<?>[parameterizedType.getActualTypeArguments().length];
171-
Type[] typeArguments = parameterizedType.getActualTypeArguments();
172-
ResolvableType contextType = ResolvableType.forClass(contextClass);
173-
for (int i = 0; i < typeArguments.length; i++) {
174-
Type typeArgument = typeArguments[i];
175-
if (typeArgument instanceof TypeVariable<?> typeVariable) {
176-
ResolvableType resolvedTypeArgument = resolveVariable(typeVariable, contextType);
177-
if (resolvedTypeArgument != ResolvableType.NONE) {
178-
generics[i] = resolvedTypeArgument.resolve();
169+
if (resolvedType.hasUnresolvableGenerics()) {
170+
Class<?>[] generics = new Class<?>[parameterizedType.getActualTypeArguments().length];
171+
Type[] typeArguments = parameterizedType.getActualTypeArguments();
172+
ResolvableType contextType = ResolvableType.forClass(contextClass);
173+
for (int i = 0; i < typeArguments.length; i++) {
174+
Type typeArgument = typeArguments[i];
175+
if (typeArgument instanceof TypeVariable<?> typeVariable) {
176+
ResolvableType resolvedTypeArgument = resolveVariable(typeVariable, contextType);
177+
if (resolvedTypeArgument != ResolvableType.NONE) {
178+
generics[i] = resolvedTypeArgument.resolve();
179+
}
180+
else {
181+
generics[i] = ResolvableType.forType(typeArgument).resolve();
182+
}
179183
}
180184
else {
181185
generics[i] = ResolvableType.forType(typeArgument).resolve();
182186
}
183187
}
184-
else if (typeArgument instanceof WildcardType wildcardType) {
185-
generics[i] = resolveWildcard(wildcardType, contextType).resolve();
188+
Class<?> rawClass = resolvedType.getRawClass();
189+
if (rawClass != null) {
190+
return ResolvableType.forClassWithGenerics(rawClass, generics).getType();
186191
}
187-
else {
188-
generics[i] = ResolvableType.forType(typeArgument).resolve();
189-
}
190-
}
191-
Class<?> rawClass = resolvedType.getRawClass();
192-
if (rawClass != null) {
193-
return ResolvableType.forClassWithGenerics(rawClass, generics).getType();
194192
}
195193
}
196194
}
@@ -226,26 +224,6 @@ private static ResolvableType resolveVariable(TypeVariable<?> typeVariable, Reso
226224
return ResolvableType.NONE;
227225
}
228226

229-
private static ResolvableType resolveWildcard(WildcardType wildcardType, ResolvableType contextType) {
230-
for (Type bound : wildcardType.getUpperBounds()) {
231-
if (bound instanceof TypeVariable<?> typeVariable) {
232-
ResolvableType resolvedTypeArgument = resolveVariable(typeVariable, contextType);
233-
if (resolvedTypeArgument != ResolvableType.NONE) {
234-
return resolvedTypeArgument;
235-
}
236-
}
237-
}
238-
for (Type bound : wildcardType.getLowerBounds()) {
239-
if (bound instanceof TypeVariable<?> typeVariable) {
240-
ResolvableType resolvedTypeArgument = resolveVariable(typeVariable, contextType);
241-
if (resolvedTypeArgument != ResolvableType.NONE) {
242-
return resolvedTypeArgument;
243-
}
244-
}
245-
}
246-
return ResolvableType.forType(wildcardType);
247-
}
248-
249227
/**
250228
* Resolve the specified generic type against the given TypeVariable map.
251229
* <p>Used by Spring Data.

spring-core/src/test/java/org/springframework/core/GenericTypeResolverTests.java

+1-68
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2023 the original author or authors.
2+
* Copyright 2002-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -194,58 +194,6 @@ public void resolveTransitiveTypeVariableWithDifferentName() {
194194
assertThat(resolved).isEqualTo(E.class);
195195
}
196196

197-
@Test
198-
void resolveWildcardTypeWithUpperBound() {
199-
Method method = method(MySimpleSuperclassType.class, "upperBound", List.class);
200-
Type resolved = resolveType(method.getGenericParameterTypes()[0], MySimpleSuperclassType.class);
201-
ResolvableType resolvableType = ResolvableType.forType(resolved);
202-
assertThat(resolvableType.hasUnresolvableGenerics()).isFalse();
203-
assertThat(resolvableType.resolveGenerics()).containsExactly(String.class);
204-
}
205-
206-
@Test
207-
void resolveWildcardTypeWithUpperBoundWithResolvedType() {
208-
Method method = method(MySimpleSuperclassType.class, "upperBoundWithResolvedType", List.class);
209-
Type resolved = resolveType(method.getGenericParameterTypes()[0], MySimpleSuperclassType.class);
210-
ResolvableType resolvableType = ResolvableType.forType(resolved);
211-
assertThat(resolvableType.hasUnresolvableGenerics()).isFalse();
212-
assertThat(resolvableType.resolveGenerics()).containsExactly(Integer.class);
213-
}
214-
215-
@Test
216-
void resolveWildcardTypeWithLowerBound() {
217-
Method method = method(MySimpleSuperclassType.class, "lowerBound", List.class);
218-
Type resolved = resolveType(method.getGenericParameterTypes()[0], MySimpleSuperclassType.class);
219-
ResolvableType resolvableType = ResolvableType.forType(resolved);
220-
assertThat(resolvableType.hasUnresolvableGenerics()).isFalse();
221-
assertThat(resolvableType.resolveGenerics()).containsExactly(String.class);
222-
}
223-
224-
@Test
225-
void resolveWildcardTypeWithLowerBoundWithResolvedType() {
226-
Method method = method(MySimpleSuperclassType.class, "lowerBoundWithResolvedType", List.class);
227-
Type resolved = resolveType(method.getGenericParameterTypes()[0], MySimpleSuperclassType.class);
228-
ResolvableType resolvableType = ResolvableType.forType(resolved);
229-
assertThat(resolvableType.hasUnresolvableGenerics()).isFalse();
230-
assertThat(resolvableType.resolveGenerics()).containsExactly(Integer.class);
231-
}
232-
233-
@Test
234-
void resolveWildcardTypeWithUnbounded() {
235-
Method method = method(MySimpleSuperclassType.class, "unbounded", List.class);
236-
Type resolved = resolveType(method.getGenericParameterTypes()[0], MySimpleSuperclassType.class);
237-
ResolvableType resolvableType = ResolvableType.forType(resolved);
238-
assertThat(resolvableType.hasUnresolvableGenerics()).isFalse();
239-
assertThat(resolvableType.resolveGenerics()).containsExactly(Object.class);
240-
}
241-
242-
@Test // gh-28904
243-
void resolveGenericWithDifferentInterfaceOrder() {
244-
Type f = First.class.getTypeParameters()[0];
245-
assertThat(resolveType(f, FirstSecondService.class)).isEqualTo(Integer.class);
246-
assertThat(resolveType(f, SecondFirstService.class)).isEqualTo(Integer.class);
247-
}
248-
249197
private static Method method(Class<?> target, String methodName, Class<?>... parameterTypes) {
250198
Method method = findMethod(target, methodName, parameterTypes);
251199
assertThat(method).describedAs(target.getName() + "#" + methodName).isNotNull();
@@ -268,21 +216,6 @@ public class MyConcreteType extends MyAbstractType<Character> {
268216
}
269217

270218
public abstract class MySuperclassType<T> {
271-
272-
public void upperBound(List<? extends T> list) {
273-
}
274-
275-
public void upperBoundWithResolvedType(List<? extends Integer> list) {
276-
}
277-
278-
public void lowerBound(List<? extends T> list) {
279-
}
280-
281-
public void lowerBoundWithResolvedType(List<? super Integer> list) {
282-
}
283-
284-
public void unbounded(List<?> list) {
285-
}
286219
}
287220

288221
public class MySimpleSuperclassType extends MySuperclassType<String> {

0 commit comments

Comments
 (0)