2013-04-21 55 views
0

我遇到了嵌套類和子類之間的關係問題。請看下面的代碼:在java中擴展具有內部類的類(以及在從一個類到另一個類時擴展內部類)

class Graph { 
    class Edge { 
    ... 
    } 

    class Vertex { 
    List<Edge> _edges; 
    ... 
    } 
    ... 
} 

class WeightedGraph extends Graph { 
    class WeightedEdge extends Edge { 
    ... 
    } 
    ... 
} 

的事情是,對於WeightedGraph寫作方法的時候,我無法訪問_edges;編輯說它不能從Edge類型轉換爲WeightedEdge。我想我還必須擴展嵌套類Vertex,因爲在Graph中它使用類型Edge,並且在WeightedGraph中它必須使用類型WeightedEdge。什麼是一個很好的方法來做到這一點(無需重新編寫代碼)?

+2

證明你是如何試圖訪問內部類的字段使用這個幫手。 – 2013-04-21 23:07:51

+0

你不能'class WeightedEdge extends Edge'。邊是圖的內部類,只在父類(圖)內可見。 – 2013-04-21 23:21:18

回答

2

您有_edges宣佈爲Graph.Vertex的成員。只有Vertex或其子類擁有該成員。如果你想讓你的班級擁有它,你也需要子類Vertex

編輯:這聽起來像你有一個額外的問題,與co和contravariance。問題是基類聲明爲包含一個通用類型爲Edge的列表。雖然您可以將WeigtedEdges存儲在其中,但如果沒有強制轉換,您將無法將其取回,因爲所有編譯器都知道它包含常規的Edges

我不記得關於泛型的確切規則,但我相信沿着這些線可能會有所幫助。或者,您可以咬住子彈並添加額外的演員。泛型的目的是幫助添加一些額外的編譯時類型檢查,但是當它阻礙時,您可以忽略它。唯一的風險是錯誤更容易漏入,因爲只能在運行時檢查類型。

class Vertex <T extends Edge> { 
    List<T> _edges; 
    ... 
    } 

class WeightedVertex extends Vertex<WeightedEdge> {...} 
0

可以定義爲從WeightedGraph訪問Vertex類字段的方法。

喜歡的東西:

class Graph 
{ 
    ... 
    protected List<Edge> getVertexEdges(Vertex v) 
    { 
     return v._edges; 
    } 
} 

所以,你可以在你的子類