in bval-jsr/src/main/java/org/apache/bval/jsr/GraphContext.java [121:150]
public ContainerElementKey runtimeKey(ContainerElementKey key) {
if (value != null) {
final Class<?> containerClass = key.getContainerClass();
final Class<? extends Object> runtimeType = value.getClass();
if (!runtimeType.equals(containerClass)) {
Exceptions.raiseUnless(containerClass.isAssignableFrom(runtimeType), ValidationException::new,
"Value %s is not assignment-compatible with %s", value, containerClass);
if (key.getTypeArgumentIndex() == null) {
return new ContainerElementKey(runtimeType, null);
}
final Map<TypeVariable<?>, Type> typeArguments =
TypeUtils.getTypeArguments(runtimeType, containerClass);
Type type =
typeArguments.get(containerClass.getTypeParameters()[key.getTypeArgumentIndex().intValue()]);
while (type instanceof TypeVariable<?>) {
final TypeVariable<?> var = (TypeVariable<?>) type;
final Type nextType = typeArguments.get(var);
if (nextType instanceof TypeVariable<?>) {
type = nextType;
} else {
return ContainerElementKey.forTypeVariable(var);
}
}
}
}
return key;
}