2013-06-24 68 views
1

我有一個父類和一些子類(我們稱之爲parentchild1,child2,等)。在Java中爲子類變量指定父類

我有一個函數,它接受的parents 2-d陣列和它變平到1 d陣列是這樣的:

public parent[] flatten(parent[][] input); 

在主叫情況下,我知道,當我傳遞數組,所有元素都具有相同的類型,並且該類型是子類型之一(特別是,我知道它是哪種子類型)。我希望能夠利用數組的特定元素,並將其分配給適當的子類型這樣的變量:

child1 c = flatten(input)[0]; 

我知道類型斷言(相關SO後:Assert an object is a specific type),但我如果斷言成功,似乎無法找到實際分配給正確類型變量的方法。在Java中這種事情甚至是可能的嗎?我知道在其他語言中可能會出現這種情況,例如Go。

回答

1

你不能allocate generic arrays,但如果你願意在出參數去傳遞你可以使用泛型照顧鑄造爲您:如果您在通過

public <T extends Parent> boolean addAll(T[][] input, 
              T[] output) { 
    //set up you indices 
    output[x] = input[z]; 
    return true; 
} 

無與倫比的輸入/輸出,你會得到一個運行時錯誤,否則它應該工作。

1

你真的想把它分配給一些孩子類型。如果該方法也在Parent類中定義,則可以使用Parent類引用訪問Child類方法。

否則,您可以鍵入強制轉換爲相應類型:

child1 c = (child1)flatten(input)[0]; 

但是,你應該確保類型是唯一child1。通常類型轉換不是一個好主意。這是錯誤代碼的標誌(但並非總是)。你應該儘可能地避免它。

+0

你知道會發生什麼,如果我typecast和我錯了嗎?在這種情況下不會發生;我只是好奇。 – joshlf

+0

它會在運行時拋出'ClassCastException'。如果你確定它不會發生在這裏,那就沒關係。但是這只是一個普遍的想法,以避免這種鑄造。 –

+0

嗯冷靜。我的參考資料是Go,在編譯時必須證明類型轉換是正確的,並且類型斷言(一個單獨的語言結構)用於在轉換之前無法證明的轉換。 – joshlf

1

嘗試「鑄造」,像這樣:

Child1 c = (Parent)flatten(input)[0];