in bval-jsr/src/main/java/org/apache/bval/jsr/metadata/ContainerElementKey.java [186:213]
private void hierarchy(Consumer<ContainerElementKey> sink) {
final TypeVariable<?> var;
if (typeArgumentIndex == null) {
var = null;
} else {
var = containerClass.getTypeParameters()[typeArgumentIndex.intValue()];
}
final Lazy<Set<ContainerElementKey>> round = new Lazy<>(LinkedHashSet::new);
Stream
.concat(Stream.of(containerClass.getAnnotatedSuperclass()),
Stream.of(containerClass.getAnnotatedInterfaces()))
.filter(AnnotatedParameterizedType.class::isInstance).map(AnnotatedParameterizedType.class::cast)
.forEach(t -> {
final AnnotatedType[] args = ((AnnotatedParameterizedType) t).getAnnotatedActualTypeArguments();
for (int i = 0; i < args.length; i++) {
final Type boundArgumentType = args[i].getType();
if (boundArgumentType instanceof Class<?> || boundArgumentType.equals(var)) {
round.get().add(new ContainerElementKey(t, Integer.valueOf(i)));
}
}
});
round.optional().ifPresent(s -> {
s.forEach(sink);
// recurse:
s.forEach(k -> k.hierarchy(sink));
});
}