Соответствующие правила в спецификации:
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.4
Класс C напрямую зависит от типа T, если T упоминается в предложении extends или реализаций C либо как суперкласс или суперинтерфейс, либо как спецификатор имени суперкласса или суперинтерфейса.
http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.1.3
Интерфейс I напрямую зависит от типа T, если T упоминается в предложении extends I как суперинтерфейс или как спецификатор в имени суперинтерфейса.
Следовательно, если A extends|implements B.C
, A зависит от C
и B
. Затем Spec запрещает циклические зависимости.
Мотивация включения B
в зависимость неясна. Как вы упомянули, если B.C
повышен до верхнего уровня C2
, то, что касается системы типов, мало что отличается, так почему A extends C2
в порядке, но не A extends B.C
? Разумеется, вложенный тип B.C
имеет некоторый привилегированный доступ к содержимому B
, но я не могу найти в спецификации ничего, что могло бы сделать A extends B.C
проблемным.
Единственная проблема, когда C
является внутренним классом. Предположим, что B=A
, A extends A.C
следует запретить, поскольку существует циклическая зависимость «включающий экземпляр». Вероятно, это и есть реальная мотивация - запретить внешнему классу наследовать внутренний класс. Фактические правила более обобщенные, потому что они проще и в любом случае имеют смысл даже для не внутренних классов.