2

我维护了 2 个具有相同功能的项目,并将此功能整合到一个公共项目中。我定义了一个接口:

public interface GraphData 
{
    public List<? extends ShapeData> getShapes();
    public void setShapes( List<? extends ShapeData> shapes );
}

我在两个项目中都实现了这个接口:

public class Graph implements GraphData 
{
     public List<Shape> shapes = new ArrayList<Shape>();

     public List<? extends ShapeData> getShapes() 
     { 
         return shapes;
     }

     public void setShapes( List<? extends ShapeData> shapes )
     {
        this.shapes = shapes;
     }
}

Shape是 的子类型ShapeData。当我编译这个类时,我收到一个关于强制转换的错误List<Shape>如何List<? of...解决这个编译错误?也许更好的问题是,我应该使用有界通配符(即?扩展)定义我的接口方法吗?

4

2 回答 2

9

基本上,您的界面太宽泛了 IMO。您已指定shapes(顺便说一下,这是一个公共字段 - 为什么?)必须是List<Shape>. 如果有人将错误类型的列表传递给 ,您会期望发生什么setShapes?例如:

public class BadShapeData implements ShapeData { ... }

...

List<BadShapeData> badShapes = new ArrayList<BadShapeData>();
new Graph().setShapes(badShapes);

不是一个列表Shape,是吗?

您可以通过使您的界面通用来修复它:

public interface GraphData<T extends ShapeData>
{
    List<T> getShapes();
    void setShapes(List<T> shapes);
}

然后:

public class Graph implements GraphData<Shape>

或者,您可以将界面更改为没有设置器。你真的需要吗?界面真的增加了很多好处吗?你不能提供比属性更有意义的操作吗?

于 2012-03-18T19:04:41.367 回答
0

我认为它本身就是复杂的。你Graph有一个List<Shape>; 获取并设置该类型。

public interface GraphData 
{
    public List<Shape> getShapes();
    public void setShapes(List<Shape> shapes );
}

我通常在接口中没有 getter/setter。这不是很有意义或有趣的行为。我不同意接口对于Graph. 您可能想考虑一下您要实现的目标。

于 2012-03-18T19:04:20.503 回答