15.4.1 杠桿利用類型參數推斷(古早Java)

Map<Person, List<? extends Pet>> petPepole = New.map();
Map<Person, List<? extends Pet>> petPeople = new HashMap<Person, List<? extends Pet>>();

看這兩行代碼的對比↑↑↑


人們對泛型有一個抱怨,使用泛型有時候需要向程序中加入更多的代碼??紤]第11章中的MapOfList.java類,如果要創(chuàng)建一個持有List的Map,就要像下滿這樣:




Map<Person, List<? extends Pet>> petPeople = 
new HashMap<Person, List<? extends Pet>>(); // 抱怨需要加入過多的代碼



看到了吧,你在重復自己做過的事情,編譯器本來應該能夠從泛型參數列表中的一個參數推斷出另一個參數。唉,可惜的是,編譯器暫時還做不到。然而,在泛型方法中,類型參數推斷可以為我們簡化一部分工作。

例如,我們可以編寫一個工具類,它包含各種各樣的static方法,專門用來創(chuàng)建各種常用的容器對象:

public class New {
    public static <K, V> Map<K, V> map() {
        return new HashMap<K, V>();
    }

    public static <T> List<T> list() {
        return new ArrayList<T>();
    }

    public static <T> LinkedList<T> lList() {
        return new LinkedList<T>();
    }

    public static <T> Set<T> set() {
        return new HashSet<T>();
    }

    public static <T> Queue<T> queue() {
        return new LinkedList<T>();
    }

    public static void main(String[] args) {
        Map<String, List<String>> sls = New.map();
        List<String> ls = New.list();
        LinkedList<String> lls = New.lList();
        Set<String> ss = New.set(); // 這里看的最明顯 New.set() 看著是不是簡潔了不少.
        Queue<String> qs = New.queue();
    }
}

Set<String> ss = New.set();
這里看的最明顯 New.set() 看著是不是簡潔了不少.


這真的是古早的Java,可能作者在編寫Tink in Java 的時候,Java就是這個樣子。
但是我現在用的Java好像能做到了。
以前必須這樣

Map<Person, List<? extends Pet>> petPeople = new HashMap<Person, List<? extends Pet>>();

現在可以這樣

Map<Person, List<? extends Pet>> petPeople2 = new HashMap<>();
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容