簡體   English   中英

(Java)如何使用有界通配符泛型實現接口方法?

[英](Java) How to implement an interface method with a bounded wildcard generic?

我維護了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;
     }
}

ShapeShapeData的子類型。 當我編譯這個類時,我得到一個關於將List<Shape>List<? of... List<? of...如何解決此編譯錯誤? 也許更好的問題是,我應該使用有界通配符定義我的接口方法(即?extends)?

基本上,你的界面太寬廣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>

或者,您可以更改界面而不是設置器。 你真的需要它嗎? 界面真的增加了很多好處嗎? 你能不能提供比財產更有意義的操作嗎?

我認為這本身就是復雜的。 您的Graph有一個List<Shape> ; 獲取並設置該類型。

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

我通常在接口中沒有getter / setter。 這不是非常有意義或有趣的行為。 我不同意Graph甚至需要一個接口。 您可能想要考慮您要實現的目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM