如何消除泛型方法返回類型中的類型轉換
考慮一個經典的OOP 場景:具有各種子類(如Dog 、Duck)的Animal 類別、 和滑鼠,每個都有獨特的行為。每隻動物都可以有一群朋友,使它們能夠彼此互動。
public class Animal { private Map<String, Animal> friends = new HashMap<>(); public void addFriend(String name, Animal animal) { friends.put(name, animal); } public Animal callFriend(String name) { return friends.get(name); } }
但是,檢索朋友的特定行為需要類型轉換,如以下程式碼片段所示:
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中文網其他相關文章!