2011-08-19 47 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

请注意,这会创建列表的副本。可能与长列表和/或时间关键型应用程序有关。 –

相关问题