至于什么是泛型通配符,我是知道的,但是不知道具体在项目里的使用场景,比如哪些情况下,我们创建的类或者接口需要用到泛型通配符呢
业精于勤,荒于嬉;行成于思,毁于随。
記住 Effective Java 一書中的這句話:Producer Extends, Consumer Super 。 這裡講得很詳細:http://stackoverflow.com/ques...
補充
TreeMap有個建構子:
TreeMap
public TreeMap(Comparator<? super K> comparator);
可以想想為什麼要指定類型Comparator super K>,而不是Comparator或Comparator extends K>?
我不寫Java,但所有的泛型都是相通的。正好我此時在看淘寶OPEN的SDK,這是一個最好來解釋泛型通配符最好的真實範例了。
我特意找了一份Java版本的SDK,見:https://github.com/ggd543/tao...
-- url: https://github.com/ggd543/taobao-sdk-java/blob/master/src/main/java/com/taobao/api/TaobaoClient.java /** * 执行TOP公开API请求。 * @param <T> * @param request 具体的TOP请求 * @return * @throws ApiException */ public <T extends TaobaoResponse> T execute(TaobaoRequest<T> request) throws ApiException ;
所有API請求都是透過 execute 来操作的,而这个方法就采用的 ? extends T 通配符上界,来限制返回的对象必须是 TaobaoResponse 的子類別。
execute
? extends T
TaobaoResponse
簡單點說就是約束。
那從淘寶SDK的角度來看,通配符上界最大的價值是淘寶所有SDK請求返回的結果都會帶有一個 code、msg 等一些通用的參數來表示API的請求狀態。
code
msg
那好,我們回過頭來看 execute 的具體實現:
if(this.needCheckRequest==true){ try{ request.check();//if check failed,will throw ApiRuleException. }catch(ApiRuleException e){ T localResponse=null; try { localResponse=request.getResponseClass().newInstance(); } catch (InstantiationException e2) { throw new ApiException(e2); } catch (IllegalAccessException e3) { throw new ApiException(e3); } localResponse.setErrorCode(e.getErrCode()); localResponse.setMsg(e.getErrMsg()); //localResponse.setBody("this."); return localResponse; } }
注意到這裡的 catch 体中 localResponse,他的类型 T,但这个T并不是简单的一个Object对象,由于前面已经限定 T 的类型必须是 TaobaoResponse 的子類別。
catch
localResponse
T
那就意味者,當對 T 进行实例后,其类型至少是 TaobaoResponse 的子类,而对于 TaobaoResponse 的定義是這樣的:
-- url: https://github.com/ggd543/taobao-sdk-java/blob/master/src/main/java/com/taobao/api/TaobaoResponse.java public abstract class TaobaoResponse implements Serializable { private static final long serialVersionUID = 5014379068811962022L; @ApiField("code") private String errorCode; @ApiField("msg") private String msg; // more }
因此你可以直接看到這樣的程式碼:
localResponse.setErrorCode(e.getErrCode());
瞧,是不是很有意思,所有通用參數都可以統一處理。
那麼從淘寶SDK的角度來講,而泛型通配符的意義就在於此了。
記住 Effective Java 一書中的這句話:Producer Extends, Consumer Super 。
這裡講得很詳細:http://stackoverflow.com/ques...
補充
TreeMap
有個建構子:可以想想為什麼要指定類型Comparator super K>,而不是Comparator或Comparator extends K>?
我不寫Java,但所有的泛型都是相通的。正好我此時在看淘寶OPEN的SDK,這是一個最好來解釋泛型通配符最好的真實範例了。
我特意找了一份Java版本的SDK,見:https://github.com/ggd543/tao...
所有API請求都是透過
execute
来操作的,而这个方法就采用的? extends T
通配符上界,来限制返回的对象必须是TaobaoResponse
的子類別。簡單點說就是約束。
那從淘寶SDK的角度來看,通配符上界最大的價值是淘寶所有SDK請求返回的結果都會帶有一個
code
、msg
等一些通用的參數來表示API的請求狀態。那好,我們回過頭來看
execute
的具體實現:注意到這裡的
catch
体中localResponse
,他的类型T
,但这个T并不是简单的一个Object对象,由于前面已经限定T
的类型必须是TaobaoResponse
的子類別。那就意味者,當對
T
进行实例后,其类型至少是TaobaoResponse
的子类,而对于TaobaoResponse
的定義是這樣的:因此你可以直接看到這樣的程式碼:
瞧,是不是很有意思,所有通用參數都可以統一處理。
那麼從淘寶SDK的角度來講,而泛型通配符的意義就在於此了。