Ваши ожидания противоположны требованиям спецификации. Из spec (стр. 27 в PDF):
Для данного интерфейса Z ограничения, помеченные как принадлежащие группе Z (т. Е. Когда группы элементов аннотации содержат интерфейс Z) или любой из суперинтерфейсов Z (унаследованных групп), считаются частью группы Z.
Другими словами, если вы подтвердите с помощью Section1.class
и пометите @NotNull
с помощью All.class
, будет применено ограничение. Но не наоборот.
Думайте об этом как о наборе: All
является общим набором ограничений, и, расширяя All
, Section1
становится надмножеством из All
, а не подмножеством. Таким образом, когда вы проверяете, используя All
, он применяет только те, которые определены в All
и его суперинтерфейсах.
Если вы хотите, чтобы All
был надмножеством ограничений, найденных в Section1
, вам нужно перевернуть наследование:
interface All extends Section1 /*, Section2, Section3...*/ {}
В этом смысле вы можете сказать себе, что All
наследует все ограничения Section1
.
Это также разумная реализация, поскольку Java чрезвычайно затрудняет поиск того, кто расширяет определенный интерфейс (в конце концов, файл класса может даже не быть доступным, пока на него не ссылаются), но тривиально легко увидеть интерфейсы, которые данный интерфейс расширяется.