После дальнейшего изучения я был изначально ошибочным.
Техническое объяснение поведения, которое вы заметили, следующее
В главе «Спецификация языка Java» на Суперклассах и subclasses
Класс
C
напрямую зависит от типаT
, еслиT
упоминается вextends
илиimplements
вC
либо как суперкласс или суперинтерфейс или как квалификатор в полностью квалифицированной форме имени суперкласса или суперинтерфейса.Класс
C
зависит от ссылочного типаT
, если выполнено одно из следующих условий:
C
напрямую зависит отT
.C
напрямую зависит от интерфейсаI
, который зависит (§9.1.3) отT
.C
напрямую зависит от классаD
, который зависит отT
(используя это определение рекурсивно).Это ошибка времени компиляции, если класс зависит от самого себя.
blockquote>Давайте возьмем ваш код с полными именами для использования типов, предполагая t классы были объявлены в пакете
com.example
:public class A implements com.example.B.BListener { public interface AListener {} } public class B implements com.example.A.AListener { public interface BListener {} }
Следуя правилам из JLS выше
A
, прямо зависит отBListener
, потому что это упомянуто вimplements
.A
напрямую зависит отB
, поскольку он упоминается как квалификатор в полностью квалифицированном имени суперинтерфейса (BListener
естьcom.example.B.BListener
)B
напрямую зависит отAListener
, поскольку он упоминается в егоimplements
.B
напрямую зависит отA
, поскольку он упоминается как определитель в полном объеме (f32)AListener
)A
напрямую зависит отB
, который зависит отA
.Поэтому
A
зависит отA
, и должна произойти ошибка компиляции.В Eclipse ошибка возникает, если вы квалифицируете имена
class A implements B.BListener { public static interface AListener { } } class B implements A.AListener { public static interface BListener { } }
Если вы используете
import
, то это не так. Я буду открывать с ними ошибку.