Skip to content

Commit 9198774

Browse files
committed
Detect wildcard without bounds returned from VariableResolver as well
See gh-32327 See gh-20727
1 parent 4308240 commit 9198774

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ private boolean isUnresolvableTypeVariable() {
655655
return true;
656656
}
657657
ResolvableType resolved = this.variableResolver.resolveVariable(variable);
658-
if (resolved == null || resolved.isUnresolvableTypeVariable()) {
658+
if (resolved == null || resolved.isUnresolvableTypeVariable() || resolved.isWildcardWithoutBounds()) {
659659
return true;
660660
}
661661
}

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

+15-4
Original file line numberDiff line numberDiff line change
@@ -1370,13 +1370,19 @@ void spr16456() throws Exception {
13701370
@Test
13711371
void gh32327() throws Exception {
13721372
ResolvableType repository1 = ResolvableType.forField(Fields.class.getField("repository"));
1373-
ResolvableType repository2 = ResolvableType.forMethodReturnType(Methods.class.getMethod("repository"));
1374-
assertThat(repository1.hasUnresolvableGenerics());
1373+
ResolvableType repository2 = ResolvableType.forMethodReturnType(Methods.class.getMethod("someRepository"));
1374+
ResolvableType repository3 = ResolvableType.forMethodReturnType(Methods.class.getMethod("subRepository"));
1375+
assertThat(repository1.hasUnresolvableGenerics()).isFalse();
13751376
assertThat(repository1.isAssignableFrom(repository2)).isFalse();
13761377
assertThat(repository1.isAssignableFromResolvedPart(repository2)).isTrue();
1377-
assertThat(repository2.hasUnresolvableGenerics());
1378+
assertThat(repository1.isAssignableFrom(repository3)).isFalse();
1379+
assertThat(repository1.isAssignableFromResolvedPart(repository3)).isTrue();
1380+
assertThat(repository2.hasUnresolvableGenerics()).isTrue();
13781381
assertThat(repository2.isAssignableFrom(repository1)).isTrue();
13791382
assertThat(repository2.isAssignableFromResolvedPart(repository1)).isTrue();
1383+
assertThat(repository3.hasUnresolvableGenerics()).isTrue();
1384+
assertThat(repository3.isAssignableFrom(repository1)).isFalse();
1385+
assertThat(repository3.isAssignableFromResolvedPart(repository1)).isFalse();
13801386
}
13811387

13821388

@@ -1424,6 +1430,9 @@ interface SomeRepository<S extends Serializable> {
14241430
<T> T someMethod(Class<T> arg0, Class<?> arg1, Class<Object> arg2);
14251431
}
14261432

1433+
interface SubRepository<S extends Serializable> extends SomeRepository {
1434+
}
1435+
14271436

14281437
static class Fields<T> {
14291438

@@ -1501,7 +1510,9 @@ interface Methods<T> {
15011510

15021511
List<String> list2();
15031512

1504-
SomeRepository<?> repository();
1513+
SomeRepository<?> someRepository();
1514+
1515+
SubRepository<?> subRepository();
15051516
}
15061517

15071518

0 commit comments

Comments
 (0)