2012-03-18 138 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> 

或者,你可以改變你的接口有二傳手。你真的需要它嗎?界面是否真的增加了很多好處?你能不能提供更多有意義的操作,而不僅僅是一個屬性?