成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院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號
国产成人18黄网站| 国产精品久久久久无码AV| 第九午夜不卡影院| 国产精品国语对白露脸在线播放| 国产免费久久久久久无码| 国产午夜成人无码一区二区| 精品福利一区二区三区免费视频| 久久人爽人人爽人人片AV| 母亲とが话しています播放| 欧美交性一级视频免费播放| 日韩精品一区二区三区中文| 无码丰满人妻熟妇区| 亚洲精品在看在线观看| 自拍偷在线精品自拍偷99| 爆乳2把你榨干哦OVA在线观看| 少妇无码AV无码一区| 无码人妻精品一区二区三18禁| 人妻人人澡人人添人人爽人人玩| 美女GIF趴跪式抽搐动态图| 欧美乱妇狂野欧美在线视频| 色婷婷综合久久久久中文| 亚洲AV无码潮喷在线观看| 一区二区三区久久含羞草| 亚洲欧美日本A∨在线观看| 中文JAPANESE在线播放| 成人爽A毛片在线视频淮北| 国产美女高潮视频| 久久久久亚洲AV无码专区桃色| 欧美性色黄大片WWW喷水| 我的初苞被强开了| 亚洲熟妇少妇任你躁在线观看无码| AAA级久久久精品无码片 | 亚洲AV蜜桃无码精品无码| 影音先锋2017AV天堂| 波多野结衣AV一区二区三区中文 | WWWらだ天堂中文在线| 国产精品国产三级国产AV剧情| 久久久久99精品成人片牛牛影视| 人妻丰满熟妇aⅴ无码HD| 亚洲av无码成人精品区在线观看| 2021国内精品久久久久免费| 国产成人一区二区三区视频免费 | 无码人妻丰满熟妇啪啪| 影音先锋女人AV女色资源| 触及真心在线观看| 成 人影片免费观看| 韩国女星潜规39集无删减| 欧美黑人一级二级巨大久久天堂 | YY8男人的天堂| 变态SM无码凌虐视频网站| 国产特级毛片AAAAAA高清| 内射到高潮的H小说| 性少妇JEAⅠOUSVU片| AV天堂永久资源网亚洲高清| 国产亚洲精品自在久久| 欧美日韩国产免费一区二区三区| 日本乱人伦AⅤ精品潮喷| 亚洲精品国产AⅤ成拍色拍| 别揉我奶头~嗯~啊~动态图视频| 激情综合婷婷色五月蜜桃| 日本漂亮妈妈7在观有限中子| 亚洲人成伊人成综合网久久久| 成人亚洲区无码区在线点播| 久久久久久久久精品成人| 天天夜碰日日摸日日澡性色AV| 正在播放东北夫妻内射| 国产农村一国产农村无码毛片| 精品久久一区二区乱码| 免费无码久久成人网站| 亚洲AⅤ中文无码字幕色本草| AV无码人妻一区二区三区在线| 娇小性XXXXX极品娇小| 色一情一乱一乱一区91Av| 亚洲AV无码国产在丝袜APP| 锕锕锕锕锕锕好污网站入口推特| 国产成人毛片在线视频 | 天堂影院一区二区三区四区| 99国内精品久久久久影院| 精品国产一区二区三区AV片| 少妇夜夜爽夜夜春夜夜高潮| 27邪态恶动图GIF喷水赞一把| 精产国品一二三产品区别在哪| 少女たちよ在线观看动漫在线观看| 18禁无遮挡无码网站免费| 精品视频国产香蕉尹人视频| 无码人妻丰满熟妇| 处破女轻点疼丨98分钟| 欧美人与动牲猛交XXXXBBB| 野花影视视频在线观看免费| 国产午夜精品一区二区三区软件| 色婷婷五月综合激情中文字幕| AV日日碰狠狠躁久久躁| 老干部熟女高潮视频| 亚洲精品无码GV在线观看| 国产精品偷伦视频免费观看了| 精品无人区一区二区三区的特点| 特级毛片A级毛片免费播放| www高潮无码免费看| 蜜臀亚洲AV无码精品国产午夜| 亚洲日本乱码在线观看 | 亚洲手机看片AV| 国产午夜精品久久久久免费视 | 女人被弄高潮视频免费| 野花日本大全免费观看10中文| 狠狠色伊人亚洲综合网站野外| 无码成人H动漫在线网站| 抖抈短视频APP下载| 人人妻人人澡人人爽人人蜜臀 | 狠狠澡人人添人人爽人妻少妇 | YES4444视频在线观看| 女教师娇喘潮喷抽搐在线视频| 一本大道东京热无码| 久久99久久99小草精品免视看| 亚洲国产成人精品青青草原| 国产午夜鲁丝片AV无码| 午夜A级毛片免费观看| 国产经典一区二区三区蜜芽| 特级毛片在线大全免费播放| 粉嫩av一区二区网站入口| 日韩成人精品久久网站| 爆乳无码AV一区二区三区小说| 全国主要城市天气预报| WWW一区二区三区在线 || 欧美性猛交乱大交3| 99久久免费国产精品2021| 欧美成人国产精品视频蜜芽| 99RE久久精品国产| 欧美丰满美乳XXⅩ高潮| 99精品国产在热久久无码| 欧美乱强伦XXXXX高潮| BBW与WB和老妇女| 欧美精品少妇XXXXⅩ另类| 99视频30精品视频在线观看| 欧美人和黑人牲交网站上线| DY888午夜福利视频| 人妻人妇人妻一区二区三区| 成 人免费 在线手机版视| 少妇人妻AV毛片在线看| 国产成人精品一区二三区在线观看| 忘忧草社区在线影视| 国产在线观看精品一区二区三区 | 亚洲 精品 制服 校园 无码| 国语对白刺激在线视频国产网红| 日本亲近相奷中文字幕视频| 成人免费高清A级毛片| 少妇极品熟妇人妻200片| 国产成人精品视频ⅤA秋霞影院 | CAOPORM超免费公开视频| 漂亮人妻洗澡被公强 日日躁| 爆乳2把你榨干哦在线观看| 色综合色欲色综合色综合色综合R| 国产精品爆乳奶水无码视频| 亚洲AV无码成人精品区天堂| 久久99精品久久久久免费| 中文字幕AⅤ人妻一区二区 | 久久久无码精品国产一区| 中文亚洲爆乳AV无码专区| 琪琪网三级伦锂电影| 高潮潮喷奶水飞溅视频无码| 亚洲AV男人的天堂在线观看| 久久精品国产亚洲AⅤ无码| 69美女ⅩXXXXXXX19| 日韩人妻精品无码一区二区三区| 国产精品久久久久乳精品爆| 亚洲精品舔Av一| 蜜桃人妻无码AⅤ中文字幕| А√天堂资源最新版在线官网| 少妇高潮喷水在线观看| 国语自产少妇精品视频| 正在播放强揉爆乳女教师| 日本无套内射ⅩXXXX人妻在线| 国产色XX群视频射精| 一二三四影视在线观看免费视频 | 丰满老熟好大BBBBBB| 亚洲AV成人无码精品| 久久夜色精品国产噜噜亚洲AV| PYTHON人马大战CSDN| 无码人妻丰满熟妇区五十路在线 | 免费无码又爽又刺激软件下载直播| 插花弄玉小说荔枝很甜作者卿凌| 香港三级日本三级A视频| 久久久久波多野结衣高潮| 办公丝袜AV一区二区三区| 亚洲 日韩 欧美 成人 在线| 乱公和我做爽死我视频| 多P混交群体交乱的安全保障| 亚洲AV无码久久精品蜜桃| 你真紧你这是要我的命吗| 国产精品久久成人网站| 夜夜高潮夜夜爽高清视频一| 日韩无人区码卡二卡3卡2022| 和丰满少妇作爱过程视频| 92国产精品午夜福利| 无码精品国产一区二区免费| 老子午夜理论影院理论| 公共厕所POOPING| 一面膜上边一面膜下边韩国| 熟妇人妻无乱码中文字幕真矢织江 | 91精品人妻一区二区三区| 无码专区无码专区视频网址|