Herencia cíclica e interfaces – la clase A no puede implementar la interfaz de clase B mientras que la clase B implementa una interfaz

Yo tengo:

public class A implements BListener { public interface AListener {} } public class B implements AListener { public interface BListener {} } 

Por lo tanto, si entiendo correctamente la herencia cíclica ocurre porque:

El compilador va a A y dice "hey, A implementa BListener, vamos a encontrar BListener!"

Entonces, cuando trata de encontrar BListener, finalmente llega a B , que dice:

"Oye, Blistener, necesario para A está dentro de B! PERO ESPERE! B necesita AListener! Vamos a buscar AListener!"

Y luego llega a A, repite. ¿Conseguí esto bien?

Por cierto, este error de compilación me pasó a mí en el desarrollo de Android.

Puede ayudar a sacarlo.

  >A is part of / \ inherits V AListener BListener ^ inherits \ / is part of B< 

Un círculo precioso. No se puede crear uno de ellos sin los otros ya existentes.

Es el compilador una ardilla con TDAH alto en café persiguiendo su propia cola?

Nope porque la ardilla no se detendría (hasta que la cafeína se acabara). El compilador busca esto y luego se da por vencido.

Nota: Eclipse tiene un error que permite esta configuración.

Después de una investigación más, inicialmente estaba equivocado.

La explicación técnica del comportamiento que está notando es la siguiente

En el capítulo Especificación de lenguaje Java de Superclases y subclases

Una clase C depende directamente de un tipo T si T se menciona en la cláusula extends o implements de C como una superclase o superinterfaz o como un calificador en la forma totalmente calificada de una superclase o un nombre de superinterfaz.

Una clase C depende de un tipo de referencia T si se cumple cualquiera de los siguientes:

  • C depende directamente de T
  • C depende directamente de una interfaz I que depende (§9.1.3) en T
  • C depende directamente de una clase D que depende de T (usando esta definición recursivamente).

Es un error de tiempo de compilación si una clase depende de sí mismo.

Tomemos su código, con nombres totalmente calificados para usos de tipo, asumiendo que las clases fueron declaradas en paquete com.example :

 public class A implements com.example.B.BListener { public interface AListener {} } public class B implements com.example.A.AListener { public interface BListener {} } 

Siguiendo las reglas de la JLS anterior

  • A depende directamente de BListener , porque se menciona en su cláusula de implements .
  • A depende directamente de B , ya que se menciona como un calificador en el nombre completo de una superinterfaz ( BListener es com.example.B.BListener )
  • B depende directamente de AListener , porque se menciona en su cláusula de implements .
  • B depende directamente de A , porque se menciona como un calificador en el nombre completo de una superinterfaz ( AListener es com.example.A.AListener )
  • A depende directamente de B que depende de A

Por lo tanto, A depende de A y debe producirse un error de compilación.


En Eclipse, el error se produce si califica los nombres

 class A implements B.BListener { public static interface AListener { } } class B implements A.AListener { public static interface BListener { } } 

Sin embargo, si usa sentencias de import , no lo hace. Voy a abrir un error con ellos.

  • Desplazamiento de ListViews juntos
  • Libgdx: configurar otra pantalla, pero los botones permanentes de la pantalla antigua están activos
  • Pasar parámetros con HttpURLConnection
  • Cómo poner una vista en el paquete
  • Android / Java - ¿Cómo puedo llamar a una función en un archivo * .java separado?
  • ¿Cómo mostrar el cajón de navegación en todas las actividades?
  • Usar JavaCV y Realm juntos causa "java.lang.UnsatisfiedLinkError"
  • Incapaz de referir proyecto de biblioteca android en adt actualizado
  • ¿Cómo implementar Pinch Zoom en la biblioteca de Picasso?
  • Funcionamiento no compatible: Android, Retrofit, OkHttp. Adición de interceptor en OkHttpClient
  • Import slidingmenu library en Eclipse Indigo Service Release 2
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.