首頁 >Java >java教程 >泛型如何消除動物朋友檢索中的型別轉換?

泛型如何消除動物朋友檢索中的型別轉換?

Barbara Streisand
Barbara Streisand原創
2024-12-11 14:21:17377瀏覽

How Can Generics Eliminate Type Casting in Animal Friend Retrieval?

如何消除泛型方法返回類型中的類型轉換

考慮一個經典的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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn