2011-08-10 25 views
3

當我有一個接口定義爲編譯錯誤提供接口作爲ArrayList類型

interface ListItem { 
    public String toString(); 
    public String getUUID(); 
} 

和實施接口的類(BrowseItem)。當我嘗試:

ArrayList<ListItem> = (method returning ArrayList of type BrowseItem) 

我得到一個不兼容的類型錯誤(found ArrayList<BrowseItem>, require ...<ListItem>

我是不是接近這一錯了嗎?

回答

2

ArrayList<listItem>不等於ArrayList<browseItem>

他們嚴格類型安全

,您可以利用?

10

Java泛型的不是協變。

見(among many other questions on SO):


解決方案:

  • 更改問題方法的返回類型。也就是說,改變

    List<listItem> = (method returning List of type browseItem) 
    // to 
    List<listItem> = (method returning List of type listItem) 
    
  • 使用通配符協方差(我認爲這就是這個叫):

    List<? extends listItem> = (method returning List of type browseItem) 
    

    注意you cannot add items to the list if you take this route


注:將列表類型聲明爲List<T>而不是ArrayList<T>通常是一種很好的做法。上面的僞代碼反映了這一點。

3

您的例子不工作,但你可以使用

ArrayList<? extends ListItem> list = (method returning ArrayList of type browseItem) 

這應該工作。