2011-07-15 17 views
10

Ho una semplice domanda:Estensione di un'interfaccia interna?

Perché Eclipse urla sull'implementazione di queste due interfacce?

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

ottengo questo messaggio di errore:

IPlayerity non può essere risolto a un tipo

+0

Quale errore si ottiene? –

+0

@jason IPlayer non può essere risolto con un tipo. – imacake

risposta

4

Si ha una dipendenza ciclica che non può essere risolta dal modo in cui funziona JLS (anche se non sono sicuro di dove sia documentato nella JLS).

Le interfacce IPlayerity e IItemity non sono visibili alla definizione dell'intestazione di classe NestedInterfaces, poiché sono al suo interno. Posso risolvere questo problema modificando il programma per

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

ma poi Eclipse mi dà questo errore, che è molto più chiaro:

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

Quindi, come possiamo aggirare il problema del "ciclo rilevato"? Il ciclo – Pacerier

+0

rilevato viene risolto definendo l'interfaccia al di fuori della classe che la implementa. –

0

Vedo che questi due interfaccia non è di default l'interfaccia java, giusto? Quindi, se ottieni l'errore "Impossibile risolvere l'iplayer in un tipo", controlla se hai ancora importato i pacchetti giusti. Dovrei commentare per questo, ma non posso. Divertiti.

5

Dichiarare le interfacce in un altro file. Mi sembra che una classe di primo livello non possa implementare le interfacce nidificate dentro di sé (anche se non sono sicuro del perché).

Se si desidera mantenere le interfacce all'interno dello stesso file, è necessario modificare il modificatore da pubblico a predefinito e dichiararlo dopo la definizione della classe.

+1

I * think * il motivo è il modo in cui funziona il caricamento delle classi. I normali riferimenti ad altre classi vengono caricati pigramente, ma le classi esterne, le superclassi e le interfacce implementate vengono caricate automaticamente prima che la classe stessa venga caricata. Quando la classe esterna implementa un'interfaccia interna e che costrutto sarebbe stata valida, si otterrebbe uno StackOverflowError nel caricatore di classe durante il caricamento della classe in fase di esecuzione ... – mihi

-1

Se non può essere risolto come un tipo, non può essere "visto". Si dovrebbe aggiungere uno di importazione per l'interfaccia:

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

ancora, ho la sensazione che il compilatore lancerà alcuni altri errori ciclici strani ..

E 'meglio se si definiscono le interfacce in un altro file.

+1

Sì ancora errore ciclico. – sulai