2012-03-18 52 views
2

我维护2个具有相同功能的项目,并将此功能整合到一个公共项目中。我定义的接口:(Java)如何使用有界通配符实现接口方法?

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; 
    } 
} 

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

+0

你在哪一行得到错误? – j13r 2012-03-18 19:02:33

+1

你不能指定一个'List <?将ShapeData>'扩展到'List '。没有看到一些背景知识,很难知道该建议什么。 – 2012-03-18 19:02:46

回答

0

我认为这是复杂化,为了自己的利益。您的Graph有一个List<Shape>;获取并设置该类型。

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

我通常在接口中没有getter/setter。这不是很有意义或有趣的行为。我不同意Graph甚至需要一个接口。你可能想要考虑你想要达到的目标。

+0

让我展开我的第一篇文章。 GraphData和ShapeData接口位于我的公共项目中。依赖于我的新公共项目的2个项目的Shape类是ShapeData的子类型。 getShapes对于两个Shape类都是通用的,但是每个Shape类中的功能都是特定于项目的。因此,Shape对象不存在于我的公共项目中,我无法定义简单的getter和setter(即列表 getShapes()和setShapes(列表形状)。 – user1277290 2012-03-18 21:55:56

8

基本上,您的界面太宽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> 

或者,你可以改变你的接口有二传手。你真的需要它吗?界面是否真的增加了很多好处?你能不能提供更多有意义的操作,而不仅仅是一个属性?