成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

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

一起來分析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號
国产精品IGAO视频| 男人边做边吃奶头视频| 16—17女人毛片毛片| 日韩欧美群交P内射捆绑| 成人毛片18女人毛片免费| 无码国产成人午夜电影在线观看| 寡妇好丰满奶好大| 亚洲乱码日产精品BD在| 久久精品国产亚洲AV麻豆甜| 一本无码人妻在中文字幕| 日本丰满护士爆乳XXⅩ| 丰满爆乳在线播放| 无码99久热只有精品视频在线观| 国产精品情侣呻吟对白视频| 一区二区中文字幕最近第九页| 日本精产国品一二三产品区别| 国产成人精品999在线观看| 亚洲无人区码二码三码区别| 日韩A片无码ⅩXXXX| 国产精品无码翘臀在线看| 51无人区码一码二码三码免费 | 射精专区一区二区朝鲜| 久久久久久精品免费免费英国| 国产精品亚洲一区二区三区| 月光影视WWW在线观看| 亚洲AV无码精品黑人黑人| 四川丰满少妇A级毛片| 人妻无码少妇一区二区| 人妻无码AⅤ中文系列久久免费 | 中文字幕日本最新乱码视频| 亚洲系列精品少妇系列50P| 亚洲AⅤ精品无码一区二区PRO| 天天躁日日躁狠狠躁欧美老妇| 三个媳妇一锅烩大团圆| 日韩精品一区二区三区色欲AV| 欧洲无人区码SUV| 欧美人妖XXXX做受| 欧美亚洲日韩AⅤ在线观看| 欧美劲爆精品白浆视频网站| 国产男女猛烈无遮挡免费视频网站| 在线永久无码不卡AV| 亚洲成A人片在线观看中文| 偷欧洲亚洲另类图片AV天堂| 少妇性生生活视频在线观看| 全彩漫画口工18禁无遮H| 美女扒开尿口让男人桶| 精品亚洲自慰AV无码喷奶水| 国产一精品一AV一免费爽爽| 国产成人无码A在线观看不卡| 把腿张开自慰给我看| らだ天堂中文在线| 暴躁妹妹CSGO| 草草永久地址发布页①| 成人性无码专区免费视频| 成在人线AV无码免费高潮喷水| 差差差很疼免费软件APP下载| 啊灬啊灬快灬高潮了视频| JAVASCRIPT的成熟分类| SLEEP强弙VIDE○SHO| 被男狂揉吃奶胸60分钟视频| 刺激战场未满十八岁能玩多久| 精品第一国产综合精品蜜芽| 国产好大好硬好爽免费不卡 | 久久久久精品精品6精品精品 | AA区一区二区三无码精片| 337P日本大胆欧洲色噜噜| CAOPORM超免费公开视频| 2023年最新绝伦推理片推荐| MM1313亚洲国产精品无码试| 宝贝这么湿想要吗| 国产精品妇女一二三区| 国产精品麻豆成人AV电影艾秋| 国产精品污WWW在线观看| 国产精品无圣光一区二区| 精品人妻一区二区三区视频 | 富婆推油偷高潮叫嗷嗷叫 | 欧美成人性生活视频| 日本夜爽爽一区二区三区| 无人区码一码二码三码区别在哪里 | 亚洲日韩国产一区二区三区在线| 透明奶罩的邻居三级在线观看| 亚洲精品自偷自拍无码| 野花免费观看高清电视| 成人毛片亚洲高潮无码精品色 | 亚洲乱码中文字幕久久孕妇黑人 | 国产精品亲子乱子伦XXXX裸| 久久强奷乱码老熟女| 人人爽人人澡人人人妻百度| 无码精品视频一区二区三区| 亚洲精品成人网站在线播放| 制服丝袜另类专区制服| 97精品依人久久久大香线蕉97| 国产精品乱码高清在线观看| 精品三级久久久久电影我网| 美女露0裸体无档动态视频 | 国产日产欧产精品精品软件| 男女作爱全部免费观爱| 亚洲AV无码乱码一级毛片孕妇 | 被学长抱进小树林C个爽作文| 韩国三级HD中文字幕| 久久一本精品久久精品66| 人人插人人操人人射av网| 亚洲无人区码一码二码三码四码| 锕锕锕锕锕锕~好湿WWW| 国产乱妇乱子在线播放视频| 青青青国产手线观看视频2019| 亚洲熟妇AV综合网五月| 刺骨PO不吃肉干嘛| 久久久无码精品亚洲日韩蜜桃| 无码日韩人妻AV一区免费| 变态SM无码凌虐视频网站| 久久人人爽人人爽人人AV东京热| 特大荫唇XX另类| 成 人色 网 站 欧美大片在线| 男j插女p无遮挡100%| 野花韩国高清免费视频6| 国精产品一二三区传媒公司| 欧美激情一区二区三区| 伊人久久大香线蕉AV五月天宝贝| 激情综合色五月丁香六月亚洲| 肉蒲团之极乐宝鉴| 中文字幕亚洲无线码| 国内精品人妻无码久久久影院导航 | 欧美搡BBBBB搡BBBBB| 亚洲 成人 无码 在线观看| JAPANESE精品中国少妇| 蜜臀久久99精品久久久久久小说| 亚洲精品无码AⅤ片桃花岛| 公么大龟弄得我好舒服秀婷视频 | 欧美日韩在线亚洲一区蜜芽| 日韩人妻无码精品专区90618| 啊灬啊灬啊灬快灬高潮了I| 人妻无码久久精品人妻| 北条麻妃国产九九九精品视频| 内射合集对白在线| 99久久伊人精品综合观看| 人妻在线无码一区二区三区| √天堂中文WWW官网在线| 男男H双腿涨灌PLAY慎入| 野花香HD免费高清版6高清版| 国产亚洲精品第一综合麻豆| 无码人妻精品一区二区三| 成在线人AV免费无码高潮喷水 | A级毛片无码兔费真人久久| 欧美乱强伦XXXXX高潮| А√天堂资源地址在线官网BT| 欧美日韩不卡合集视频| BGMBGMBGM老太太水太多| 日韩AV无码中文字幕| 国产精品美女乱子伦高潮| 亚洲AV无码一区二区三区18| 久久久久夜色精品国产| JAPANESE熟女熟妇多毛毛| 四虎影视永久地址WWW成人| 鳮巴又大又爽我高潮了免费视频 | 国产69精品久久久久观看软件| 小SB是不是想被C了| 精品久久人人爽天天玩人人妻| 亚洲欧美成人A∨在线观看| 欧美成人国产精品视频蜜芽| 7777奇米四色成人眼影| 日韩AV无码精品一二三区| 国产成人午夜高潮毛片| 亚洲精品99久久久久中文字幕| 年轻夫妻把小孩哄睡后开监控| CF穿越火线女去衣看奶| 日韩论理论片在线观看| 精品人妻少妇AV一区二区三区| 边做饭边被躁欧美三级| 亚洲AV无码成人专区| 女主快穿到各个世界做小三| 成人欧美激情亚洲日韩蜜臀| 亚洲日韩国产精品第一页一区| 人人做天天爱夜夜爽2020| 国外精产品W灬源码16| А√ 天堂 在线官网中文| 少妇高潮惨叫喷水正在播放| 含羞草自慰抽搐喷白浆AⅤ| 一本大道一卡2卡三卡4卡国产| 熟妇高潮喷沈阳45熟妇高潮喷| 久久夜色精品国产亚洲AV动态图| 国产精品VA无码一区二区| 中文字幕无码AV不卡一区| 亚洲AV成人无码网站| 日韩精品人妻系列无码专区| 精品无码日韩一区二区三区不卡 | 特级西西人体444WWW高清大 | 亚洲女毛多水多21P| 日韩欧美午夜成人精品视频| 欧美狂野乱码一二三四区| 51被公侵犯玩弄漂亮人妻| 亚洲欧美韩国综合色| 亚洲中文久久精品无码WW16| 亚洲中文无码A∨在线观看| 亚洲成A人片在线观看WWW| 亚洲精品国产精品乱码视色| 玩弄三个高大的熟妇赶尸艳谈| 美女扒开尿口让男人桶| 麻花豆传媒剧国产MV免费天美| 麻豆日产精品卡2卡3卡4卡5卡|