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

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

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

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

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

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

推薦學(xué)習(xí):《java視頻教程》

泛型不是運行時特性

我們這里依然說的是Open JDK

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

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

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

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

泛型通配符

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

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

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

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

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

上界通配符

在面向?qū)ο缶幊填I(lǐng)域,我們認(rèn)為基類base在最上層。從繼承樹的角度來看,Object類處于最上層。

所以我們將這樣的表達(dá)<? 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);    ... }
登錄后復(fù)制

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

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

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

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

不同的使用方可以自己定義不同類型的Advice,便使得能支持非常多的參數(shù)類型比如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; }
登錄后復(fù)制

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

上界通配符的表達(dá)無法再set

使用上屆通配符的表達(dá)方式無法再設(shè)置泛型字段,其實意思就是上界通配符不能改變已經(jīng)設(shè)置的泛型類型,我們一起來看下這個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());//將編譯錯誤     }
登錄后復(fù)制

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

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

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

下界通配符

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

語言陷阱

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

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

存取的時候可以存可以轉(zhuǎn)為T的類或T,也就是可以設(shè)置Fruit或Fruit子類的類。

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

spring-kafka的異步回調(diào)

現(xiàn)在,讓我們看實際的一個例子。

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

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

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);    }  ...
登錄后復(fù)制

SettableListenableFuture有重載的addCallback函數(shù),支持添加ListenableFutureCallback<? super T> callback和SuccessCallback<? super T> successCallback;當(dāng)調(diào)用的異步方法成功結(jié)束的時候使用notifySuccess來觸發(fā)onSuccess的執(zhí)行,這個時候?qū)嶋H異步執(zhí)行的結(jié)果變成參數(shù)給callback調(diào)用。

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

SuccessCallback是一個函數(shù)式接口,從設(shè)計模式的角度來看是一個消費者,消費<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); }

登錄后復(fù)制

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

這是因為super能支持的范圍

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
日本免费黄视频| 国产高清www| 久久国产乱子伦免费精品| 91嫩草国产丨精品入口麻豆| 久久久国产欧美| 青青在线视频观看| 激情伊人五月天| 91视频 - 88av| 先锋影音男人资源| 91香蕉国产线在线观看| 国产精欧美一区二区三区白种人| 北条麻妃av高潮尖叫在线观看| 18禁网站免费无遮挡无码中文| 蜜桃视频一区二区在线观看| av电影一区二区三区| 亚欧精品在线视频| 欧美专区第二页| 欧美日韩久久婷婷| 在线播放黄色av| 人人妻人人澡人人爽精品欧美一区| 第四色婷婷基地| 精品久久久99| 亚洲一区二区三区四区精品| 在线观看免费视频污| 美女黄色片网站| 免费日韩在线观看| 丰满少妇大力进入| 国产免费毛卡片| 日本女优爱爱视频| 中文字幕日韩综合| 99re99热| 久草视频这里只有精品| 黄网站欧美内射| 老熟妇仑乱视频一区二区| 999精品网站| 欧美视频亚洲图片| 超碰10000| 欧美一级在线看| 手机看片福利日韩| 国产资源中文字幕| 加勒比成人在线| 久草青青在线观看| 拔插拔插华人永久免费| 国产精品久久国产| 日本在线视频www| 日韩av片免费观看| 国产精品第157页| www.国产区| av电影一区二区三区| 青青草视频在线免费播放| 久久精品免费网站| 女人床在线观看| 凹凸日日摸日日碰夜夜爽1| 加勒比av中文字幕| 国产男女免费视频| 特级黄色片视频| 国产黄页在线观看| 国产精品久久久久久久av福利| 91视频 - 88av| 久久久国产欧美| 91精品国产91久久久久麻豆 主演| 99爱视频在线| 黄色三级视频在线播放| 黄色一级视频片| 日本一二三区在线| 无码播放一区二区三区| 五月天婷婷在线观看视频| 少妇人妻无码专区视频| 欧美成人手机在线视频| 日批视频在线免费看| 国产不卡的av| av五月天在线| 欧美乱大交xxxxx潮喷l头像| 欧美成人乱码一二三四区免费| 欧美日韩黄色一级片| 美女黄色片网站| 高清av免费看| 欧美激情精品久久久久久小说| 国产高清不卡无码视频| 在线视频一二区| 人人干人人视频| 日韩精品 欧美| 日韩一二区视频| 2025韩国大尺度电影| 亚洲最大综合网| 国产无套内射久久久国产| 人妻互换免费中文字幕| avove在线观看| 91蝌蚪视频在线| 红桃视频 国产| 一区二区三区视频网| 日韩中文字幕二区| 免费黄色日本网站| 男女超爽视频免费播放| 精品国偷自产一区二区三区| 肉大捧一出免费观看网站在线播放| 久久6免费视频| av免费一区二区| 天天干天天av| 三级av免费观看| 一区二区三区入口| 99视频在线免费| 国产成人综合一区| 黄色a级片免费| 欧美精品一区二区三区免费播放| 成年人午夜视频在线观看| 国内精品在线观看视频| 鲁一鲁一鲁一鲁一色| 国产91xxx| 欧美变态另类刺激| 日韩一级在线免费观看| jizz欧美激情18| av免费一区二区| 伊人精品视频在线观看| 男人j进女人j| 妺妺窝人体色777777| heyzo国产| 精品免费国产一区二区| 在线观看免费成人av| 爽爽爽在线观看| www.国产二区| 国产黄视频在线| 天堂av在线网站| 国产系列第一页| 国产精品国产亚洲精品看不卡| 黄色动漫在线免费看| 天天操天天爱天天爽| 大桥未久一区二区| 激情深爱综合网| 亚洲高清免费在线观看| 毛片在线视频观看| 激情婷婷综合网| 午夜啪啪免费视频| 日韩av在线播放不卡| 久久综合伊人77777麻豆最新章节| 一区二区三区国产好的精华液| 免费看日本黄色| 中文字幕第36页| 久久久天堂国产精品| 熟妇人妻va精品中文字幕| 亚洲第一页在线视频| 日本黄色三级大片| 午夜啪啪福利视频| 国产精品久久久久9999小说| 性鲍视频在线观看| 色婷婷综合久久久久中文字幕| 日本中文字幕在线不卡| 日本成人在线免费视频| 伊人再见免费在线观看高清版| 国产一区视频免费观看| 日韩亚洲欧美一区二区| 香蕉视频999| aaaaaa亚洲| 日韩中文字幕在线不卡| 黄色一级片免费的| 在线观看的毛片| 成人综合视频在线| www国产免费| 久久久久久久久久久久久久久国产| 2018中文字幕第一页| 91精品视频国产| 91在线视频观看免费| 水蜜桃色314在线观看| 潘金莲一级淫片aaaaaa播放1| 成人免费xxxxx在线视频| 欧美不卡在线播放| 天堂8在线天堂资源bt| 欧美性受xxxx黑人猛交88| 五月婷婷丁香色| 久久精品网站视频| 亚洲色欲综合一区二区三区| 日韩视频 中文字幕| 亚洲高清av一区二区三区| 手机在线看福利| 无码日韩人妻精品久久蜜桃| 欧美 日本 亚洲| 18岁网站在线观看| 337p粉嫩大胆噜噜噜鲁| 久久久久久免费看| 无码日本精品xxxxxxxxx| 欧美另类videos| 女女百合国产免费网站| 国产一二三四区在线观看| 污污视频在线免费| 二级片在线观看| 公共露出暴露狂另类av| 色男人天堂av| 黄色一级片av| 免费视频爱爱太爽了| 国产曰肥老太婆无遮挡| 国产 日韩 亚洲 欧美| 日韩xxxx视频| 日韩av黄色网址| 国产视频一区二区视频| 91日韩视频在线观看| 亚洲免费黄色录像| 日本天堂免费a| 你懂的av在线| 国产精品人人爽人人爽| www.桃色.com|