使用返回類型中的泛型克服類型轉換
在 OOP 程式設計中,類別通常會維護相關物件的集合。例如,Animal 類別可能會追蹤朋友列表,該列表可以是各種子類別(例如 Dog 和 Duck)的實例。
傳統上,由於朋友的異質性,從該清單中檢索特定朋友需要進行類型轉換。集合。這會產生以下程式碼:
Mouse jerry = new Mouse(); jerry.addFriend("spike", new Dog()); jerry.addFriend("quacker", new Duck()); ((Dog) jerry.callFriend("spike")).bark(); ((Duck) jerry.callFriend("quacker")).quack();
為了避免這種繁瑣的類型轉換,請考慮使用泛型使 callFriend 方法的傳回類型特定於正確的子類別。但是,在這種特定場景中,將返回類型指定為參數,例如:
public <T extends Animal> T callFriend(String name, T unusedTypeObj) { return (T)friends.get(name); }
沒有幫助,因為未使用的類型參數在運行時不提供其他資訊。
相反,有一種解決方法涉及將所需類型的類別作為參數傳遞給callFriend:
public <T extends Animal> T callFriend(String name, Class<T> type) { return type.cast(friends.get(name)); }
透過此實現,方法呼叫變為:
jerry.callFriend("spike", Dog.class).bark(); jerry.callFriend("quacker", Duck.class).quack();
此解決方案消除了運行時類型轉換,並確保傳回的物件可以安全地轉換為所需的子類別。
以上是從異質集合中檢索物件時,泛型如何消除類型轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!