一種非常“怪異”的包含兩層generic返回Class類型的寫法

其實這並不怪異,只是一般情況下用不到這種寫法。這個東西的標準名稱爲“泛型方法”。極少數情況,我們需要返回一個List<?>的class type。

@Override
public Class<List<MobileRowData>> getPresentationType() {
    return (Class<List<MobileRowData>>) Collections.<MobileRowData>emptyList().getClass();
}

以後遇上這樣的東西,就可以這樣寫。


如果你去看了Collections.emptyList()方法的源代碼(JDK1.7.0_80),你就會發現一些非常有用的信息。源代碼如下:

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

方法聲明中的第一行中第一個<T>表示這個emptyList方法聲明、方法體、方法參數列表中會用到這個<T>。如果T是String,那麼就可以將上述源代碼看成:

public static final List<String> emptyList() {
    return (List<String>) EMPTY_LIST;
}

當然,上面的代碼只是給你解釋如果<T>是String時,<T> List<T> emptyList()的等效代碼,從功能上看兩段代碼並不等效。也就是說,<T> List<T> emptyList()給了開發人員在調用emptyList()方法時指定泛型的機會。而LIst<String> emptyList()這種聲明方式沒有留機會給開發人員在其調用emptyList()方法時設置泛型。

開發人員在調用emptyList()方法時可以用如下這種方式指定<T>:

Collections.<String>emptyList();  //返回 List<String>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章