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:
- Puntero de la cabeza FileOutputStream
- Descripción de RecyclerView.ViewHolder
- Incorporación de ListView dentro de la Galería
- ¿Qué hace la referencia `android.accounts.Account.type`?
- Puedo matar o terminar () una actividad en un hilo que no sea el hilo de la interfaz de usuario ...?
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.
- Toast Stop - getConnectedNodes
- ¿Cómo inicializar un arraylist de dos columnas?
- Devolver un valor de AsyncTask en Android
- Cómo combinar a dos mapa de bits uno sobre otro
- Cómo agregar una notificación de inserción en mi propia aplicación de Android
- ¿Cómo mostrar un mensaje junto con el tiempo en groupchat?
- Java.lang.SecurityException: bloqueo de permisos de BLUETOOTH. (Sólo dispositivos Samsung)
- ¿Es posible anular un método nativo en una clase Java en Android / dalvik?
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 tipoT
siT
se menciona en la cláusulaextends
oimplements
deC
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 referenciaT
si se cumple cualquiera de los siguientes:
C
depende directamente deT
C
depende directamente de una interfazI
que depende (§9.1.3) enT
C
depende directamente de una claseD
que depende deT
(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 deBListener
, porque se menciona en su cláusula deimplements
. -
A
depende directamente deB
, ya que se menciona como un calificador en el nombre completo de una superinterfaz (BListener
escom.example.B.BListener
) -
B
depende directamente deAListener
, porque se menciona en su cláusula deimplements
. -
B
depende directamente deA
, porque se menciona como un calificador en el nombre completo de una superinterfaz (AListener
escom.example.A.AListener
) -
A
depende directamente deB
que depende deA
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.
- El atributo pathPrefix de Deeplink de Android se está omitiendo
- Android IPC, servicio no obtener instanciado