2

假設我有擴展超類的類SubClass1和SubClass2。我需要將所有擴展超類的對象存儲在一個列表(列表列表)中。現在我將這個列表傳遞給一個函數,它可以計算出SuperClass之前的哪個SubClass。這個函數然後應該將SuperClass重新轉換回它們各自的子類。例如,將子類對象存儲爲超類並稍後檢索子類

for (SuperClass superClass : list) { 
    if (superClass.getType().equals("SubClass1") 
     SubClass1 subClass = (SubClass1) superClass; 
    else if (superClass.getType().equals("SubClass2") 
     SubClass2 subClass = (SubClass2) superClass; 
} 

此示例將導致類轉換異常。有沒有簡單的解決方案來獲得這個功能?

編輯:正如其中一個答案中提到的,這段代碼應該會導致異常。在這個例子中,getType()方法必須有錯誤。但是,使用instanceof關鍵字的解決方案通過消除對getType()方法的需求來解決問題。

回答

5

使用instanceof operator。您可以將您的代碼轉換爲:

for (SuperClass superClass: list) { 
    if (superClass instanceof SubClass1) { 
     SubClass1 subClass = (SubClass1) superClass; 
    } 
    else if (superClass instanceof SubClass2) { 
     SubClass2 subClass = (SubClass2) superClass; 
    } 
    else { 
     // Something strange has happened, or superClass is null 
    } 
} 
1

是,

而不是從到達對象,你可以測試對象的實例,以某種類型的其他詞,你compare the types類型。

if(superClass instanceof SubClass1) { 

    } 

如果當superClassnull,中頻返回FALSE。

1

本示例不會引發任何異常。快速測試:

List<SuperClass> list = new ArrayList<SuperClass>(); 
    int count = 50; 
    Random random = new Random(); 
    while(count-- > 0) { 
     if(random.nextBoolean()) { 
      list.add(new SubClass1()); 
     } else { 
      list.add(new SubClass2()); 
     } 
    } 

    for (SuperClass superClass : list) { 
     if (superClass.getType().equals("SubClass1")){ 
      SubClass1 subClass = (SubClass1) superClass; 
      System.out.println(subClass); 
     }else if (superClass.getType().equals("SubClass2")){ 
      SubClass2 subClass = (SubClass2) superClass; 
      System.out.println(subClass); 
     } 
    } 

如果你有類轉換異常,最有可能的getType()執行類的其中一個返回錯誤的值,這就是爲什麼你有類轉換exception.Or你的子類不擴展超類的一個。