gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

一起來分析Java泛型和泛型的通配符

本篇文章給大家帶來了關于java的相關知識,其中主要介紹了關于泛型以及泛型的通配符相關問題,因為泛型的支持是編譯器支持,字節碼加載到虛擬機的時候泛型信息已經被擦除,所以泛型不支持一些運行時特性,下面一起來看一下,希望對大家有幫助。

一起來分析Java泛型和泛型的通配符

程序員必備接口測試調試工具:立即使用
Apipost = Postman + Swagger + Mock + Jmeter
Api設計、調試、文檔、自動化測試工具
后端、前端、測試,同時在線協作,內容實時同步

推薦學習:《java視頻教程》

泛型不是運行時特性

我們這里依然說的是Open JDK

因為泛型的支持是編譯器支持,字節碼加載到虛擬機的時候泛型信息已經被擦除,所以泛型不支持一些運行時特性。所以要注意有些寫法將編譯不過,比如new。

如下,類Plate<T>是帶泛型的類,如下演示,

new Plate(...) new Plate(...) class Plate {     T item;     public Plate(T t) {         new T();//是錯誤的,因為T是一個不被虛擬機所識別的類型,最終會被編譯器擦除轉為Object類給到虛擬機         item = t;     }     public void set(T t) {         item = t;     }     public T get() {         return item;     } }
登錄后復制

泛型T不能被new,因為T是一個不被虛擬機所識別的類型。

泛型通配符

存在三種形式的用通配符的泛型變量表達,分別是:

  • <? extends A>: C<? extends A> c,c中的元素類型都是A或者A的子類

  • <? super B>:C<? super B> c,c中的元素類型是B或者B的父類

  • <?>:C<?> c,c中的元素類型不確定

具體是什么意思以及怎么使用,我們一起來看看吧~

上界通配符

在面向對象編程領域,我們認為基類base在最上層。從繼承樹的角度來看,Object類處于最上層。

所以我們將這樣的表達<? extends T>稱為上界通配符。

<? extends T>表示T或繼承T類型的任意泛型類型。

先看下面這個例子.

Sping Webmvc中的RequestBodyAdvice

public interface RequestBodyAdvice {    /**     * Invoked first to determine if this interceptor applies.     * @param methodParameter the method parameter     * @param targetType the target type, not necessarily the same as the method     * parameter type, e.g. for {@code HttpEntity}.     * @param converterType the selected converter type     * @return whether this interceptor should be invoked or not     */    boolean supports(MethodParameter methodParameter, Type targetType,          Class> converterType);    ... }
登錄后復制

在ping Webmvc中,RequestBodyAdvice用來處理http請求的body,supports用來判斷是否支持某種參數類型到HttpMessage請求的轉換。

HttpMessageConverter是一個接口,比如支持Body為Json格式的JsonViewRequestBodyAdvice類,實現如下:

@Override public boolean supports(MethodParameter methodParameter, Type targetType,       Class> converterType) {    return (AbstractJackson2HttpMessageConverter.class.isAssignableFrom(converterType) &&          methodParameter.getParameterAnnotation(JsonView.class) != null); }
登錄后復制

使用AbstractJackson2HttpMessageConverter來處理JsonView,Jackson2庫是流行的Java JSON解析庫之一,也是Springboot自帶的HttpMessageConverter.

不同的使用方可以自己定義不同類型的Advice,便使得能支持非常多的參數類型比如xml,那么sping-webmvc的功能也就更加靈活通用了,可以將很多Type通過不同的HttpMessageConverter翻譯為不同的HttpInputMessage請求。如下所示,

@Override public HttpInputMessage beforeBodyRead(HttpInputMessage request, MethodParameter parameter,       Type targetType, Class> converterType) throws IOException {    for (RequestBodyAdvice advice : getMatchingAdvice(parameter, RequestBodyAdvice.class)) {       if (advice.supports(parameter, targetType, converterType)) {          request = advice.beforeBodyRead(request, parameter, targetType, converterType);       }    }    return request; }
登錄后復制

通過getMatchingAdvice(parameter, RequestBodyAdvice.class)獲得匹配的advice列表,遍歷這個列表解析支持parameter的Advice得到HttpInputMessage類型的請求。

上界通配符的表達無法再set

使用上屆通配符的表達方式無法再設置泛型字段,其實意思就是上界通配符不能改變已經設置的泛型類型,我們一起來看下這個demo。

    @Test     void genericTest() {                 Plate p = new Plate(new Apple());         p.set(new Apple());//可以set           Apple apple = p.get();                    Plate q = new Plate(new Apple());                 Fruit fruit = q.get();                 q.set(new Fruit());//將編譯錯誤     }
登錄后復制

Plate<? extends Fruit>這種表達方式意味著java編譯期只知道容器里面存放的是Fruit和它的派生類,具體是什么類型不知道,可能是Fruit、Apple或者其他子類, 編譯器在p賦值以后,盤子里面沒有標記為“Apple",只是標記了一個占位符“CAP#1”(可以通過javap反編譯字節碼來嚴重),來表示捕獲一個Fruit或者Fruit的子類。

但是不管是不是通配符的寫法,泛型終究指的是一種具體的類型,而且被編譯器使用了特殊的“CAP#1”,所以我們無法再重新設置這個字段了,否則就會出現類型不一致的編譯錯誤了。

但這個特點對于用法來說并沒有妨礙,框架使用上界通配符范型達到靈活擴展的目的。

下界通配符

接下來我們一起看下下界通配符,<? super T>表示T或T父類的任意類型,下界的類型是T。

語言陷阱

我們在理解上容易掉入一個陷阱,以為只可以設置Fruit或Fruit的基類。實際上Fruit和Fruit的子類才可以設置進去,讓我們寫一個單元測試來看看。

@Test void genericSuperTest() {     Plate p = new Plate(new Fruit());     p.set(new Apple()); //ok,存取的時候可以存任意可以轉為T的類或T     p.set(new Object()); //not ok,無法 set Object     Object object = p.get();//ok     Fruit object = p.get();//not ok,super Fruit不是Fruit的子類 }
登錄后復制

存取的時候可以存可以轉為T的類或T,也就是可以設置Fruit或Fruit子類的類。

但是使用的時候必須使用object來引用。

spring-kafka的異步回調

現在,讓我們看實際的一個例子。

SettableListenableFuture是spring 并發框架的一個類,繼承自Future<T>,我們知道Future表示異步執行的結果,T表示返回結果的類型。ListenableFuture可以支持設置回調函數,如果成功了怎么處理,如果異常又如何處理。

在spring-kafka包里使用了SettableListenableFuture來設置異步回調的結果,kafka客戶端調用 doSend發送消息到kafka隊列之后,我們可以異步的判斷是否發送成功。

public class SettableListenableFuture implements ListenableFuture {   ...    @Override    public void addCallback(ListenableFutureCallback callback) {       this.settableTask.addCallback(callback);    }    @Override    public void addCallback(SuccessCallback successCallback, FailureCallback failureCallback) {       this.settableTask.addCallback(successCallback, failureCallback);    }  ...
登錄后復制

SettableListenableFuture有重載的addCallback函數,支持添加ListenableFutureCallback<? super T> callback和SuccessCallback<? super T> successCallback;當調用的異步方法成功結束的時候使用notifySuccess來觸發onSuccess的執行,這個時候將實際異步執行的結果變成參數給callback調用。

private void notifySuccess(SuccessCallback callback) {    try {       callback.onSuccess((T) this.result);    }    catch (Throwable ex) {       // Ignore    } }
登錄后復制

SuccessCallback是一個函數式接口,從設計模式的角度來看是一個消費者,消費<T>類型的result。ListenableFutureCallback同理。

public interface SuccessCallback {    /**     * Called when the {@link ListenableFuture} completes with success.     * 

Note that Exceptions raised by this method are ignored. * @param result the result */ void onSuccess(@Nullable T result); }

登錄后復制

為什么要用notifySuccess(SuccessCallback<? super T> callback)呢?

這是因為super能支持的范圍

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
欧美日韩在线中文| 不卡中文字幕在线观看| 国产精欧美一区二区三区白种人| 你真棒插曲来救救我在线观看| 四季av一区二区三区| 国产成人手机视频| 999香蕉视频| av免费在线播放网站| 免费黄色日本网站| 精品人妻一区二区三区四区在线 | 亚洲欧美日韩一二三区| www欧美激情| wwwwwxxxx日本| 激情五月婷婷基地| 亚洲综合123| 白白操在线视频| 天天做天天躁天天躁| 青青草精品视频在线| 自慰无码一区二区三区| 37pao成人国产永久免费视频| 爱福利视频一区二区| 亚洲一级免费观看| 99re精彩视频| 996这里只有精品| 人妻有码中文字幕| 伊人国产在线视频| 日韩人妻精品一区二区三区| 久久精品无码中文字幕| 国产精品人人妻人人爽人人牛| 亚洲黄色a v| www.国产二区| 黄色国产精品视频| 超碰在线免费av| 欧美 日韩 国产 高清| 日本 片 成人 在线| 久久福利一区二区| 日韩中文字幕免费在线| 警花观音坐莲激情销魂小说| 国产欧美日韩网站| 亚洲精品成人在线播放| 东北少妇不带套对白| 婷婷六月天在线| 国产91沈先生在线播放| 久久久久久久片| 少妇久久久久久被弄到高潮| 男人天堂成人在线| 小说区视频区图片区| 免费国产成人av| 成人毛片一区二区| 五月天男人天堂| 日韩大片一区二区| 一女被多男玩喷潮视频| 中文字幕第50页| 国产三级精品三级在线| 亚洲 高清 成人 动漫| 欧美另类videos| 精品少妇人妻av一区二区| 黄色三级视频片| 精品99在线视频| 黄色激情在线视频| 免费看日b视频| 欧美一级免费在线观看| 亚洲欧美偷拍另类| 日本女优爱爱视频| 欧美污视频网站| 日本a级片免费观看| 又粗又黑又大的吊av| 超碰成人免费在线| av免费观看国产| 2018国产在线| 91好吊色国产欧美日韩在线| 免费不卡av在线| 妺妺窝人体色777777| 亚洲熟妇无码一区二区三区| 国产精品视频网站在线观看 | 黄色成人在线看| 亚洲精品蜜桃久久久久久| 日本高清xxxx| 大陆极品少妇内射aaaaaa| 国产日韩欧美大片| 偷拍盗摄高潮叫床对白清晰| 日本福利视频导航| 欧美 国产 精品| 六月婷婷在线视频| 成年人黄色片视频| 亚洲色图久久久| 香蕉视频xxxx| 久久国产精品视频在线观看| 无码专区aaaaaa免费视频| 国产l精品国产亚洲区久久| 久久久久久久久久久视频| 手机看片福利盒子久久| 亚洲在线观看网站| 欧美黄色免费网址| 青青草原成人网| 亚洲网中文字幕| 日本韩国欧美在线观看| 中文字幕国产免费| 91午夜在线观看| 免费看污黄网站| 国内少妇毛片视频| 韩国中文字幕av| 白白操在线视频| 色片在线免费观看| 热久久最新网址| 69久久久久久| 日韩精品视频在线观看视频| 亚洲综合在线网站| 久草视频这里只有精品| 中国黄色片免费看| 男人用嘴添女人下身免费视频| 午夜啪啪小视频| 国产成人久久777777| 亚洲精品天堂成人片av在线播放 | 日韩欧美一区二| 手机av在线网站| 国产一级不卡毛片| 日韩av新片网| 成人性做爰片免费视频| 乌克兰美女av| 99爱视频在线| 91传媒免费视频| 日本黄色福利视频| 五月婷婷狠狠操| 国产精品12345| 欧美日韩dvd| 一级黄色录像免费看| 九九热99视频| 手机看片一级片| 手机av在线免费| 亚洲欧美自拍另类日韩| 国产精品无码av无码| 5月婷婷6月丁香| 成人免费性视频| 亚洲熟妇无码一区二区三区| 精品视频在线观看一区二区| 在线观看17c| 女人色极品影院| 日日摸日日碰夜夜爽无码| 国产日韩亚洲欧美在线| 给我免费播放片在线观看| 日本男女交配视频| 久久艹国产精品| 黄色免费视频大全| 成人性做爰aaa片免费看不忠| 日本成年人网址| 超碰在线97免费| 国产美女18xxxx免费视频| 激情在线观看视频| 日本精品免费视频| av动漫在线免费观看| heyzo亚洲| 免费日韩中文字幕| 日韩av片免费观看| 成年丰满熟妇午夜免费视频 | 秋霞无码一区二区| 欧美激情精品久久久久久小说| 亚洲 中文字幕 日韩 无码| 色婷婷狠狠18| 一二三四中文字幕| 欧美日韩精品在线一区二区| av丝袜天堂网| 99久久99久久精品| 国产成人精品视频免费看| 鲁一鲁一鲁一鲁一av| 成年人三级视频| 播放灌醉水嫩大学生国内精品| 九色porny自拍| 国产精品国三级国产av| 成人在线观看黄| 成人在线免费观看网址| 十八禁视频网站在线观看| 丰满女人性猛交| 免费黄色福利视频| www.黄色网址.com| 午夜精品久久久内射近拍高清 | 裸体裸乳免费看| 国产成人精品无码播放| 欧美三级午夜理伦三级老人| 999在线观看视频| 欧美在线aaa| 色综合av综合无码综合网站| 最新av网址在线观看| 日本爱爱免费视频| 欧美日韩不卡在线视频| 一级黄色免费在线观看| 在线免费视频a| 91视频 - 88av| 日日夜夜精品视频免费观看| 国产日韩一区二区在线| 丰满人妻一区二区三区53号| 欧美性受xxxxxx黑人xyx性爽| 狠狠操精品视频| 国产xxxxx在线观看| 精品无码国产一区二区三区av| 欧美激情第四页| av在线免费看片| 天堂av手机在线| 亚洲精品mv在线观看| 久久久久久久久久一区|