2011-07-15 25 views
10

Tengo una simple pregunta:¿Extendiendo una interfaz interna?

¿Por qué Eclipse grita sobre la implementación de estas dos interfaces?

public abstract class Gateway implements IPlayerity, IItemity { 
    public interface IPlayerity { ... } 
    public interface IItemity { ... } 
    // I...ity 
} 

me sale este mensaje de error:

IPlayerity no se puede resolver a un tipo

+0

¿Qué error se puede conseguir? –

+0

@jason IPlayerity no se puede resolver a un tipo. – imacake

Respuesta

4

Tiene una dependencia cíclica que no se puede resolver dada la forma en que funciona el JLS (aunque no estoy seguro de dónde está documentado en el JLS).

Las interfaces IPlayerity y IItemity no son visibles para la definición de encabezado de clase NestedInterfaces, ya que están dentro de ella. Puedo arreglar esto cambiando su programa para

public class NestedInterfaces implements 
     NestedInterfaces.IPlayerity, NestedInterfaces.IItemity 
{ 
    public interface IPlayerity {} 
    public interface IItemity {} 
} 

pero luego Eclipse me da este error, que es mucho más claro:

Multiple markers at this line 
- Cycle detected: the type NestedInterfaces cannot extend/implement itself or one of its own member types 
- Cycle detected: the type NestedInterfaces cannot extend/implement itself or one of its own member types 
+2

Entonces, ¿cómo solucionamos el problema del "ciclo detectado"? – Pacerier

+0

ciclo detectado resuelto al definir la interfaz fuera de la clase que lo implementa. –

0

veo que estos dos interfaz no está predeterminado de la interfaz de Java, ¿verdad? Por lo tanto, si obtiene el error "IPlayerity no se puede resolver a un tipo", compruebe si importa los paquetes adecuados todavía. Debería comentar sobre esto, pero simplemente no puedo. Que te diviertas.

5

Declara las interfaces en otro archivo. Es evidente para mí que una clase de nivel superior no puede implementar las interfaces anidadas dentro de sí misma (aunque no estoy seguro de por qué).

Si desea mantener las interfaces dentro del mismo archivo, debe cambiar el modificador de público a predeterminado y declararlas después de la definición de la clase.

+1

I * think * la razón es cómo funciona la carga de clases. Las referencias normales a otras clases se cargan de forma diferida, pero las clases externas, las superclases y las interfaces implementadas se cargan automáticamente antes de cargar la clase. Cuando su clase externa implementa una interfaz interna y esa construcción hubiera sido válida, obtendría un StackOverflowError en el cargador de clases al cargar la clase en el tiempo de ejecución ... – mihi

-1

Si no se puede resolver como un tipo, no se puede "ver". Usted debe agregar una importación para la interfaz:

import package.Gateway.IPlayerity 
import package.Gateway.IItemity 

Sin embargo, tengo la sensación de que el compilador arrojará algunos otros errores cíclicos extraños ..

Es mejor si define las interfaces en otro archivo.

+1

Sí, aún error cíclico. – sulai