Merge branch '6.2.x'
This commit is contained in:
commit
03cce13937
|
@ -156,6 +156,9 @@ public final class GenericTypeResolver {
|
||||||
if (genericType instanceof TypeVariable<?> typeVariable) {
|
if (genericType instanceof TypeVariable<?> typeVariable) {
|
||||||
ResolvableType resolvedTypeVariable = resolveVariable(
|
ResolvableType resolvedTypeVariable = resolveVariable(
|
||||||
typeVariable, ResolvableType.forClass(contextClass));
|
typeVariable, ResolvableType.forClass(contextClass));
|
||||||
|
if (resolvedTypeVariable == ResolvableType.NONE) {
|
||||||
|
resolvedTypeVariable = ResolvableType.forVariableBounds(typeVariable);
|
||||||
|
}
|
||||||
if (resolvedTypeVariable != ResolvableType.NONE) {
|
if (resolvedTypeVariable != ResolvableType.NONE) {
|
||||||
Class<?> resolved = resolvedTypeVariable.resolve();
|
Class<?> resolved = resolvedTypeVariable.resolve();
|
||||||
if (resolved != null) {
|
if (resolved != null) {
|
||||||
|
@ -173,6 +176,9 @@ public final class GenericTypeResolver {
|
||||||
Type typeArgument = typeArguments[i];
|
Type typeArgument = typeArguments[i];
|
||||||
if (typeArgument instanceof TypeVariable<?> typeVariable) {
|
if (typeArgument instanceof TypeVariable<?> typeVariable) {
|
||||||
ResolvableType resolvedTypeArgument = resolveVariable(typeVariable, contextType);
|
ResolvableType resolvedTypeArgument = resolveVariable(typeVariable, contextType);
|
||||||
|
if (resolvedTypeArgument == ResolvableType.NONE) {
|
||||||
|
resolvedTypeArgument = ResolvableType.forVariableBounds(typeVariable);
|
||||||
|
}
|
||||||
if (resolvedTypeArgument != ResolvableType.NONE) {
|
if (resolvedTypeArgument != ResolvableType.NONE) {
|
||||||
generics[i] = resolvedTypeArgument;
|
generics[i] = resolvedTypeArgument;
|
||||||
}
|
}
|
||||||
|
@ -226,7 +232,7 @@ public final class GenericTypeResolver {
|
||||||
return resolvedType;
|
return resolvedType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ResolvableType.forVariableBounds(typeVariable);
|
return ResolvableType.NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -243,6 +243,13 @@ class GenericTypeResolverTests {
|
||||||
assertThat(resolvedType.toString()).isEqualTo("java.util.List<E>");
|
assertThat(resolvedType.toString()).isEqualTo("java.util.List<E>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void resolveTypeFromGenericDefaultMethod() {
|
||||||
|
Type type = method(InterfaceWithDefaultMethod.class, "get", InheritsDefaultMethod.AbstractType.class).getGenericParameterTypes()[0];
|
||||||
|
Type resolvedType = resolveType(type, InheritsDefaultMethod.class);
|
||||||
|
assertThat(resolvedType).isEqualTo(InheritsDefaultMethod.ConcreteType.class);
|
||||||
|
}
|
||||||
|
|
||||||
private static Method method(Class<?> target, String methodName, Class<?>... parameterTypes) {
|
private static Method method(Class<?> target, String methodName, Class<?>... parameterTypes) {
|
||||||
Method method = findMethod(target, methodName, parameterTypes);
|
Method method = findMethod(target, methodName, parameterTypes);
|
||||||
assertThat(method).describedAs(target.getName() + "#" + methodName).isNotNull();
|
assertThat(method).describedAs(target.getName() + "#" + methodName).isNotNull();
|
||||||
|
@ -454,4 +461,20 @@ class GenericTypeResolverTests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface InterfaceWithDefaultMethod<T extends InheritsDefaultMethod.AbstractType> {
|
||||||
|
|
||||||
|
default String get(T input) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AbstractType {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class InheritsDefaultMethod implements InterfaceWithDefaultMethod<InheritsDefaultMethod.ConcreteType> {
|
||||||
|
|
||||||
|
static class ConcreteType implements AbstractType {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue