将具体类型列表转换为Java中的接口列表

时间:2011-08-19 13:52:36

标签: java list types casting

有没有办法将具体类型列表转换为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?
  }

}

提前致谢,

上限

3 个答案:

答案 0 :(得分:11)

您可以使用generic wildcards来允许派生列表用作基本列表:

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

请注意,返回的列表不能添加非空项。 (正如绍尔先生指出的那样,你可以添加null,删除也很好。)这是权衡,但希望在你的情况下无关紧要。

由于getShapes()是覆盖,您还需要更新Repository中的返回类型。

答案 1 :(得分:5)

如果你真的想这样做,下面的内容可能会起作用

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

答案 2 :(得分: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;
    }
}