2013-08-22 98 views
-2

爲什麼java不允許繼承類型作爲overriden方法的參數?爲什麼java不允許繼承類型作爲重寫方法的參數?

例如我有Graph類和矢量類繼承自元素class.Now我有另一個類放類我在哪裏有一個方法像元素操作(元素e).. 現在,如果我有putGraph類和putVector類繼承自put類和兩個類,例如在圖類中,如果我重寫操作()方法就像這個圖操作(圖g)它顯示的錯誤。爲什麼是這樣?對不起,對於冗長的描述

+1

小心給我們看一些代碼? – StormeHawke

+0

你有Graph和Vector作爲Element的子類,putGraph和putVector是Put類的子類嗎?是對的嗎? – Kon

+0

代碼在哪裏,錯誤是什麼? – GriffeyDog

回答

1

我假設你的代碼是這樣的?

class Element { 
    public Element manipulate(Element e) { ... } 
} 

class Graph extends Element { 
    @Override 
    public Graph manipulate(Graph g) { ... } 
} 

這會給你一個錯誤。我認爲它不能被允許的理由是這樣的:

Graph g1; 
Element e1 = g1; 
Vector v1;   // another subclass of Element 
Element e2 = e1.manipulate(v1); 

e1被聲明爲Element,所以編譯器將允許e1.manipulate(v1)因爲v1也是Element(實際上屬於一個子類,這是OK) 。編譯器在編譯時不知道e1實際上是Graph。但是當你運行它時,由於e1在運行時的實際類型是Graph,Graph類中的manipulate方法被稱爲(多態),但參數gVector而不是Graph,如參數g所述,它應該是是。那麼該計劃應該做什麼?

如果上面真的是你想要的,你需要像

class Graph extends Element { 
    @Override 
    public Graph manipulate(Element e) { // it's OK to change the *return* type, 
              // in later versions of Java 
     if (e instanceof Graph) { 
      Graph g = (Graph)e; 
      // now you can work with g 
     } else 
      throw new SomeException(); // or return null, or whatever is 
             // appropriate 
    } 

} 

不知道,如果你的問題是像這樣的東西,因爲我還沒有看到任何的代碼呢。

相關問題