2011-07-15 128 views
10

我有一個簡單的問題:擴展內部接口?

爲什麼Eclipse尖叫實現這兩個接口?

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

我收到此錯誤信息:

IPlayerity不能被解析爲一個類型

+0

你什麼錯誤? –

+0

@jason IPlayerity無法解析爲類型。 – imacake

回答

4

由於JLS的工作方式(儘管我不確定JLS中的位置在哪裏),您有循環依賴關係無法解決。

接口IPlayerity和IItemity對於NestedInterfaces類頭定義不可見,因爲它們在裏面。我可以通過改變你的程序

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

解決這個問題,但隨後的Eclipse給了我這個錯誤,這是更爲明確:

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

那麼我們如何解決「週期檢測」問題呢? – Pacerier

+0

週期檢測通過定義實現它的類之外的接口來解決。 –

0

我看到這兩個接口是不是默認的Java接口,對不對?因此,如果出現錯誤「IPlayerity無法解析爲某種類型」,請檢查是否導入了正確的軟件包。我應該對此發表評論,但我只是不能。玩的開心。

5

聲明另一個文件中的接口。它對我來說很明顯,頂層類不能實現嵌套在其內部的接口(儘管我不知道爲什麼)。

如果要將接口保留在同一個文件中,則必須將修飾符從public更改爲default,並在類定義之後聲明它們。

+1

我*認爲*原因是類加載如何工作。對其他類的普通引用會被懶惰地加載,但是在加載類之前會自動加載外部類,超類和已實現的接口。當你的外部類實現了一個內部接口並且該結構將是有效的,那麼當你在運行時加載類時,你會在類加載器中得到一個StackOverflowError ... – mihi

-1

如果它不能被解析爲類型,那麼它不能被「看到」。您應該添加一個導入的接口:

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

的是,我有一種感覺,那麼編譯器將會拋出其他一些奇怪的循環錯誤..

它的更好,如果你在另一個文件中定義的接口。

+1

是的,仍然是循環錯誤。 – sulai