轉自:
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);//不正確的使用第二種泛型方法,不會出現編譯錯誤,但邏輯不正確,運行時會出現異常,危險!
}
}
現在知道了這兩種極其相似的泛型方法的區別了吧?
第一種泛型方法:返回值和參數值的類型是一致,推薦使用;
第二種泛型方法:返回值和參數值的類型不是一致,請謹慎或避免使用。