2011-07-15 37 views
10

Mam proste pytanie:Rozszerzenie wewnętrznego interfejsu?

Dlaczego Eclipse krzyczy o wdrażaniu tych dwóch interfejsów?

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

otrzymuję komunikat o błędzie:

IPlayerity nie mogą być rozwiązane do rodzaju

+0

Jaki błąd otrzymasz? –

+0

@jason IPlayerity nie może być rozwiązany na typ. – imacake

Odpowiedz

4

Masz cykliczną zależność, której nie można rozwiązać, biorąc pod uwagę sposób działania JLS (chociaż nie jestem pewien, gdzie w JLS jest to udokumentowane).

Interfejsy IPlayerity i IItemity nie są widoczne w definicji nagłówka klasy NestedInterfaces, ponieważ znajdują się w niej. Mogę to naprawić zmieniając swój program do

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

ale potem Eclipse daje mi ten błąd, który jest znacznie bardziej jasne:

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

Jak więc obejść problem "wykrycia cyklu"? – Pacerier

+0

Wykryto cykl rozwiązany przez zdefiniowanie interfejsu poza klasą implementującą go. –

0

widzę, że te dwa interfejs nie jest domyślny interfejs Java, prawda? Tak więc, jeśli pojawi się błąd "IPlayerity nie można rozwiązać na typ.", Sprawdź, czy zaimportowałeś odpowiednie pakiety. Powinienem to skomentować, ale nie mogę. Baw się dobrze.

5

Deklaracja interfejsów w innym pliku. Jest dla mnie oczywiste, że klasa najwyższego poziomu nie może implementować interfejsów zagnieżdżonych w sobie (chociaż nie jestem pewien dlaczego).

Jeśli chcesz zachować interfejsy w tym samym pliku, musisz zmienić modyfikator z publicznego na domyślny i zadeklarować je po definicji klasy.

+1

Ja * myślę * powodem tego, jak działa ładowanie klas. Normalne odniesienia do innych klas są ładowane leniwie, ale klasy zewnętrzne, superklasy i zaimplementowane interfejsy są ładowane automatycznie przed załadowaniem samej klasy. Gdy twoja zewnętrzna klasa implementuje wewnętrzny interfejs i ta konstrukcja byłaby ważna, otrzymasz StackOverflowError w programie ładującym klasy podczas ładowania klasy w czasie wykonywania ... – mihi

-1

Jeśli nie można go rozpoznać jako typu, nie można go "zobaczyć". Należy dodać import do interfejsu:

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

wciąż mam wrażenie, że to kompilator rzuci jakieś inne dziwne błędy cykliczne ..

Lepiej jeśli zdefiniowanie interfejsów w innym pliku.

+1

Tak, nadal cykliczny błąd. – sulai