2011-08-19 48 views
7

有沒有方法將具體類型列表轉換爲Java接口列表的接口?在Java中將具體類型列表轉換爲其接口列表

例如:

public class Square implements Shape { ... } 

public SquareRepository implements Repository { 

    private List<Square> squares; 

    @Override 
    public List<Shape> getShapes() { 
    return squares; // how can I return this list of shapes properly cast? 
    } 

} 

由於提前,

上限

回答

11

您可以使用generic wildcards的允許導出列表用作基地名單:

public List<? extends Shape> getShapes() { ... } 

請注意,返回列表不能有非空項目添加到它。 (正如Sauer先生指出的那樣,您可以添加null,並且刪除也不錯。)這是一種折衷,儘管希望這對您的情況無關緊要。

由於getShapes()是一個覆蓋,你需要在Repository更新返回類型爲好。

+1

「*不能寫入*」是不是*完全*精確:您仍然可以添加'null'並移除元素。 –

+0

謝謝。更新以反映這一點。 – dlev

+0

如果「那」在我的情況下很重要? – osrl

3

如果你在控制接口Repository,我建議你重構它以返回List<? extends Shape>類型的東西。

編譯沒有問題:

interface Shape { } 

class Square implements Shape { } 

interface Repository { 
    List<? extends Shape> getShapes(); 
} 

class SquareRepository implements Repository { 
    private List<Square> squares; 

    @Override 
    public List<? extends Shape> getShapes() { 
     return squares; 
    } 
} 
4

如果你真的想這樣做,有點像下面可能工作

@Override 
public List<Shape> getShapes() { 
    return new ArrayList<Shape>(squares); 
} 
+0

喜歡它。比處理「擴展」更清潔 – yurgis

+0

請注意,這會創建列表的副本。可能與長列表和/或時間關鍵型應用程序有關。 –

相關問題