2015-02-24 28 views
0

我有一個父類Parent,和三個類延伸它:ChildOneChildTwoChildThree,其每一個從Parent類重寫的方法。我創建了一個Parent對象數組,然後動態地(從用戶輸入)創建其中一個子類的對象。在此之後,我需要遍歷Parent[]數組,並且想要將每個元素排版到它的「真實」類(其中一個子類)中,以便使用適當的重寫方法。
我試圖爲子類的類型創建變量,就像這樣:動態typcasting作爲子類

for (int i = 0; i < parents.length; i++) { 
     try { 
      Parent par = new Parent(); 
      par = parents[i]; 
      switch (par.getType()) { 
       case "one": 
        ChildOne child1 = (ChildOne)par; 
        System.out.println(child1.overridenMethod()); 
        break; 
       case "two": 
        ChildTwo child2 = (ChildTwo)par; 
        System.out.println(child2.overridenMethod()); 
        break; 
       case "three": 
        ChildThree child3 = (ChildThree)par; 
        System.out.println(child3.overridenMethod()); 
        break; 
      } 
     } catch (NullPointerException npe) { 
      System.out.println("No child at position: " + i); 
     } 
    } 

,但我得到一個錯誤說ChildThree不能被強制轉換爲ChildTwo。看起來,在第一個元素(它是成功的類型轉換)之後,par對象將保留其被類型轉換的任何子類的子類對象。
我該如何解決這個問題,並能夠根據數組中每個對象的類來進行類型轉換?
非常感謝!

+0

爲什麼使用類型轉換?爲什麼多態不可行? – kraskevich 2015-02-24 16:59:57

回答

1

覆蓋意味着您在父項中有一個方法,並且子項正在覆蓋其功能。

你可以直接在你的情況下使用多態。

for (Parent par: parents) { 
    try { 
     System.out.println(par.overridenMethod()); 
    } catch (NullPointerException npe) { 
     System.out.println("No child at position: " + i); 
    } 
} 
+0

如果我不將它們轉換爲特定的'Child'對象,我怎樣才能獲得特定的overriden方法,而不是原始的'Parent'方法?該數組包含'Parent'對象。 – 2015-02-24 17:04:32

+0

父項是否包含overridenMethod()方法? – Crazyjavahacking 2015-02-24 17:06:06

+0

是的,它確實包含它。 – 2015-02-24 17:08:32

1

如前所述之前沒有必要投,因爲你調用每個對象的方法在父類中已經定義:無需鑄造。所以,你可以簡單的寫:

for (int i = 0; i < parents.length; i++) { 
    Parent par = parents[i]; 
    System.out.println(par.overridenMethod()); 
} 

關於你的類型轉換的錯誤,我的猜測是,你有你的getType方法是錯誤的。它可能會爲您的一個子實現返回一個錯誤的值,並最終導致錯誤的大小寫塊。一般來說,在投射對象時應該使用instanceof:

if(par instanceof ChildOne){ 
    ChildOne child1 = (ChildOne)par; 
}