Detect wildcard without bounds returned from VariableResolver as well

See gh-32327
See gh-20727
This commit is contained in:
Juergen Hoeller 2024-02-25 16:32:11 +01:00
parent 430824038e
commit 9198774f13
2 changed files with 16 additions and 5 deletions

View File

@ -655,7 +655,7 @@ public class ResolvableType implements Serializable {
return true;
}
ResolvableType resolved = this.variableResolver.resolveVariable(variable);
if (resolved == null || resolved.isUnresolvableTypeVariable()) {
if (resolved == null || resolved.isUnresolvableTypeVariable() || resolved.isWildcardWithoutBounds()) {
return true;
}
}

View File

@ -1370,13 +1370,19 @@ class ResolvableTypeTests {
@Test
void gh32327() throws Exception {
ResolvableType repository1 = ResolvableType.forField(Fields.class.getField("repository"));
ResolvableType repository2 = ResolvableType.forMethodReturnType(Methods.class.getMethod("repository"));
assertThat(repository1.hasUnresolvableGenerics());
ResolvableType repository2 = ResolvableType.forMethodReturnType(Methods.class.getMethod("someRepository"));
ResolvableType repository3 = ResolvableType.forMethodReturnType(Methods.class.getMethod("subRepository"));
assertThat(repository1.hasUnresolvableGenerics()).isFalse();
assertThat(repository1.isAssignableFrom(repository2)).isFalse();
assertThat(repository1.isAssignableFromResolvedPart(repository2)).isTrue();
assertThat(repository2.hasUnresolvableGenerics());
assertThat(repository1.isAssignableFrom(repository3)).isFalse();
assertThat(repository1.isAssignableFromResolvedPart(repository3)).isTrue();
assertThat(repository2.hasUnresolvableGenerics()).isTrue();
assertThat(repository2.isAssignableFrom(repository1)).isTrue();
assertThat(repository2.isAssignableFromResolvedPart(repository1)).isTrue();
assertThat(repository3.hasUnresolvableGenerics()).isTrue();
assertThat(repository3.isAssignableFrom(repository1)).isFalse();
assertThat(repository3.isAssignableFromResolvedPart(repository1)).isFalse();
}
@ -1424,6 +1430,9 @@ class ResolvableTypeTests {
<T> T someMethod(Class<T> arg0, Class<?> arg1, Class<Object> arg2);
}
interface SubRepository<S extends Serializable> extends SomeRepository {
}
static class Fields<T> {
@ -1501,7 +1510,9 @@ class ResolvableTypeTests {
List<String> list2();
SomeRepository<?> repository();
SomeRepository<?> someRepository();
SubRepository<?> subRepository();
}