2012-07-07 172 views
3

我正在實現一個Java Graph庫(學習...)。因此,我寫了一個接口Java - 使用Object參數實現接口

public interface DigraphInterface { 
    public boolean isEmpty(); 
    public int size(); 
    public boolean isAdjacent(Object v, Object w); 
    public void insertEdge(Object v, Object w); 
    public void insertVertex(Object v); 
    public void eraseEdge(Object o, Object w); 
    public void eraseVertex(Object v); 
    public void printDetails(); 
} 

作爲邁向實現的第一步,我寫了實現上述接口的Digraph類。但是,爲了簡單起見,我想節點標識爲整數,所以我定義功能

@Override 
    public boolean isAdjacent(int v, int w) { 
      // TODO Auto-generated method stub 
      return adjList[v].contains(w) || adjList[w].contains(v); 
    } 

但是,我得到的錯誤,我需要重寫或超實現方法。有人可以向我解釋這種行爲的基礎。另外,如果有人可以解釋,我們如何設計允許靈活添加任何類型組件的庫。

+0

除了'int'甚至不是一個'Object',一個實現不能提供比接口更少的承諾。你的接口已經承諾處理任何對象**。 – 2012-07-07 08:51:13

+0

那麼,我應該怎麼做呢?我希望我不需要改變接口,當我希望實現另一個用字符串或別的東西標識節點的類。 – Code4Fun 2012-07-07 08:55:44

回答

5

您接口說:

public boolean isAdjacent(Object v, Object w); 

您實現:

public boolean isAdjacent(int v, int w) 

對Java這並沒有相同的簽名,因此是不一樣的方法。你可以做的是使用仿製藥,這取決於你所需要的,但在這種情況下,你可以這樣做:

public interface DigraphInterface<T> { 
    ... 
    public boolean isAdjacent(T v, T w); 
    ... 
} 

和您的實現可能是:

public class DefaultDigraph<Integer> { 
    ... 
    public boolean isAdjacent(Integer v, Integer w) { 
     ... 
    } 
    ... 
} 
當然

你需要要小心,因爲Integer可以爲空,而int不可以。因此,在自動拆箱之前,對參數進行空檢查將是一個好主意。

+0

我的理解是,當我們將int傳遞給方法時,如果需要的話,Java自動將它轉換爲Object。如果它沒有找到任何帶有int參數的方法,它必須將它綁定到帶有Object參數的方法。我也這麼想。 – Code4Fun 2012-07-07 08:54:38

+1

是的,爲了調用yes,當你調用一個方法時,參數被裝箱到它的WrapperClass中,在這種情況下是'Integer',但是對於方法實現,簽名**必須是**。因此,這是行不通的:'public boolean isAdjacent(int v,int w)'。你明白了嗎? – 2012-07-07 08:58:32

+0

好的,謝謝Francisco解釋我。我將使用泛型來實現這一點。我的目標是有一個接口和幾個實現可以用不同方式識別節點 – Code4Fun 2012-07-07 09:01:21