有没有办法将具体类型列表转换为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?
}
}
提前致谢,
上限
答案 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;
}
}