java泛型方法的使用

轉自:

http://blog.sina.com.cn/s/blog_617a491c0100eox7.html

java泛型方法在方法返回值是容器類對象時廣泛使用。
public static List<T> find(Class<T> clazz,String userId){
     ....
}
一般來說編寫java泛型方法時,返回值類型和至少一個參數類型應該是泛型,而且類型應該是一致的,如果只有返回值類型或參數類型之一使用了泛型,這個泛型方法的使用就大大的限制了,基本限制到跟不用泛型一樣的程度。


下面主要介紹兩種十分相似的java泛型方法的使用以及它們之間的區別。
第一種:
    public static <T extends CommonService> T getService(Class<T> clazz) {
        T service = (T) serviceMap.get(clazz.getName());
        if (service == null) {
            service = (T) ServiceLocator.getService(clazz.getName());
            serviceMap.put(clazz.getName(), service);
        }
        return service;
    }
第二種:
    public static <T> T getService(Class<? extends CommonService> clazz) {
        T service = (T) serviceMap.get(clazz.getName());
        if (service == null) {
            service = (T) ServiceLocator.getService(clazz.getName());
            serviceMap.put(clazz.getName(), service);
        }
        return service;
    }
下面是泛型方法所在的類:
public abstract class CommonService {
    private static HashMap<String, CommonService> serviceMap = new HashMap<String, CommonService>();
    //這裏是泛型方法定義
    .
    .
    .
}


這兩個泛型方法只有方法的簽名不一樣,方法體完全相同,那它們有什麼不一樣呢?
我們來使用一下它們,就知道它們的區別了。
對第一種泛型方法使用:
public class Main {
    public static void main(String[] args) {
        NoticeService noticeService=CommonService.getService(NoticeService.class);//正確的使用第一種泛型方法,不會出現編譯錯誤。
        NoticeService noticeService=CommonService.getService(UserService.class);//不正確的使用第一種泛型方法,會出現編譯錯誤
       
    }
}
對第二種泛型方法使用:
public class Main {
    public static void main(String[] args) {
        NoticeService noticeService=CommonService.getService(NoticeService.class);//正確的使用第二種泛型方法,不會出現編譯錯誤,邏輯也正確,運行時不會出現異常。
        NoticeService noticeService=CommonService.getService(UserService.class);//不正確的使用第二種泛型方法,不會出現編譯錯誤,但邏輯不正確,運行時會出現異常,危險!
  
    }
}
現在知道了這兩種極其相似的泛型方法的區別了吧?
第一種泛型方法:返回值和參數值的類型是一致,推薦使用;
第二種泛型方法:返回值和參數值的類型不是一致,請謹慎或避免使用。

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