久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

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

一起來(lái)分析Java泛型和泛型的通配符

本篇文章給大家?guī)?lái)了關(guān)于java的相關(guān)知識(shí),其中主要介紹了關(guān)于泛型以及泛型的通配符相關(guān)問(wèn)題,因?yàn)榉盒偷闹С质蔷幾g器支持,字節(jié)碼加載到虛擬機(jī)的時(shí)候泛型信息已經(jīng)被擦除,所以泛型不支持一些運(yùn)行時(shí)特性,下面一起來(lái)看一下,希望對(duì)大家有幫助。

一起來(lái)分析Java泛型和泛型的通配符

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

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

泛型不是運(yùn)行時(shí)特性

我們這里依然說(shuō)的是Open JDK

因?yàn)榉盒偷闹С质蔷幾g器支持,字節(jié)碼加載到虛擬機(jī)的時(shí)候泛型信息已經(jīng)被擦除,所以泛型不支持一些運(yùn)行時(shí)特性。所以要注意有些寫(xiě)法將編譯不過(guò),比如new。

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

new Plate(...) new Plate(...) class Plate {     T item;     public Plate(T t) {         new T();//是錯(cuò)誤的,因?yàn)門(mén)是一個(gè)不被虛擬機(jī)所識(shí)別的類型,最終會(huì)被編譯器擦除轉(zhuǎn)為Object類給到虛擬機(jī)         item = t;     }     public void set(T t) {         item = t;     }     public T get() {         return item;     } }
登錄后復(fù)制

泛型T不能被new,因?yàn)門(mén)是一個(gè)不被虛擬機(jī)所識(shí)別的類型。

泛型通配符

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

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

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

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

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

上界通配符

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

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

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

先看下面這個(gè)例子.

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用來(lái)處理http請(qǐng)求的body,supports用來(lái)判斷是否支持某種參數(shù)類型到HttpMessage請(qǐng)求的轉(zhuǎn)換。

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

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

使用AbstractJackson2HttpMessageConverter來(lái)處理JsonView,Jackson2庫(kù)是流行的Java JSON解析庫(kù)之一,也是Springboot自帶的HttpMessageConverter.

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

@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ù)制

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

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

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

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

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

但這個(gè)特點(diǎn)對(duì)于用法來(lái)說(shuō)并沒(méi)有妨礙,框架使用上界通配符范型達(dá)到靈活擴(kuò)展的目的。

下界通配符

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

語(yǔ)言陷阱

我們?cè)诶斫馍先菀椎羧胍粋€(gè)陷阱,以為只可以設(shè)置Fruit或Fruit的基類。實(shí)際上Fruit和Fruit的子類才可以設(shè)置進(jìn)去,讓我們寫(xiě)一個(gè)單元測(cè)試來(lái)看看。

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

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

但是使用的時(shí)候必須使用object來(lái)引用。

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

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

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

在spring-kafka包里使用了SettableListenableFuture來(lái)設(shè)置異步回調(diào)的結(jié)果,kafka客戶端調(diào)用 doSend發(fā)送消息到kafka隊(duì)列之后,我們可以異步的判斷是否發(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é)束的時(shí)候使用notifySuccess來(lái)觸發(fā)onSuccess的執(zhí)行,這個(gè)時(shí)候?qū)?shí)際異步執(zhí)行的結(jié)果變成參數(shù)給callback調(diào)用。

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

SuccessCallback是一個(gè)函數(shù)式接口,從設(shè)計(jì)模式的角度來(lái)看是一個(gè)消費(fèi)者,消費(fèi)<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)呢?

這是因?yàn)閟uper能支持的范圍

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
日韩激情av在线| 日本aⅴ精品一区二区三区| 国产成人免费| 美女久久久久| 久久久男人天堂| 国产毛片精品| 综合亚洲自拍| 久热精品在线| 国产99久久久国产精品成人免费| 免费亚洲婷婷| 国产精品观看| 日韩一区网站| 青青草国产成人99久久| 亚洲一二三区视频| 久久成人一区| 亚洲精品影视| 亚洲网址在线观看| 五月婷婷亚洲| 影音国产精品| 中文字幕人成乱码在线观看| **爰片久久毛片| 国产精品一区二区美女视频免费看| 亚洲天堂免费| 国产一区91| 性色av一区二区怡红| 2023国产精品久久久精品双| 美女网站一区| 欧美99久久| 亚洲香蕉网站| 国产模特精品视频久久久久| 国产一区成人| 国内精品美女在线观看| 国产精品色在线网站| 日韩动漫一区| 欧美1区2区3| 久久99国产精品视频| 久久久91麻豆精品国产一区| 日韩大片在线| 亚洲婷婷在线| 亚洲美女91| 国产欧美啪啪| 精品国产欧美日韩一区二区三区| 欧美日韩免费看片| 99精品电影| 国产成人1区| 亚洲午夜黄色| 中文av在线全新| 日韩中文影院| 亚洲欧洲日韩精品在线| 少妇精品久久久一区二区| 亚洲精品乱码久久久久久蜜桃麻豆 | 正在播放日韩精品| 精品视频自拍| 一区二区视频欧美| 亚洲欧美日韩专区| 亚洲久久一区| 久久久精品国产**网站| 精品国产欧美日韩一区二区三区| 国产欧美69| 青青久久av| 国产亚洲亚洲| 久久久久黄色| 久久麻豆精品| 美女精品一区| 麻豆精品久久| 久久久久久黄| 六月丁香综合| 精品久久99| 欧洲激情综合| 日韩精品一页| 欧洲一区二区三区精品| 国产日韩综合| 国产精品一区二区精品视频观看| 国内一区二区三区| aa国产精品| 青青国产精品| 日韩av免费| 免费人成网站在线观看欧美高清| 久久久精品国产**网站| 国产精品av一区二区| 亚洲精品第一| 日韩精品一区二区三区免费观影 | 国产精品一区高清| 日韩视频不卡| 麻豆精品在线| 99在线观看免费视频精品观看| 久久av日韩| 亚洲成人精选| 欧美激情99| 亚洲免费高清| 国产精品超碰| 在线日韩成人| 欧美aa一级| 日本aⅴ免费视频一区二区三区| av亚洲在线观看| 国产日韩欧美中文在线| 999精品色在线播放| 欧美a一区二区| 美女91精品| 成人在线视频中文字幕| 91欧美精品| 伊人影院久久| 美女av在线免费看| 久久精品二区亚洲w码 | 久久免费精品| 日韩成人午夜精品| 亚洲视频综合| 成人精品高清在线视频| 深夜日韩欧美| av一区在线| 久久影院资源站| 亚洲精品中文字幕99999| 国产一区二区亚洲| 日本中文字幕不卡| 91九色精品| 伊人久久在线| 国产精品欧美大片| 亚洲欧美日韩国产一区二区| 欧美jjzz| 国产精品蜜芽在线观看| 国产无遮挡裸体免费久久| 视频一区视频二区在线观看| 日韩精品1区| 久久男人av| 免费日韩成人| 国产日韩中文在线中文字幕| 日韩影院精彩在线| 欧美日韩四区| 九九精品调教| 精品免费av在线| 成人在线超碰| 日韩一区二区三区精品| 亚洲精品女人| 久久xxxx| 三级久久三级久久久| 日韩网站在线| 亚洲国产不卡| 亚洲免费成人| 亚洲黄色在线| 国产高清日韩| 国产日韩欧美| 日本精品一区二区三区在线观看视频| 中文字幕一区二区三区在线视频| 亚洲欧美高清| 91精品91| 亚洲成人三区| 久久国产成人午夜av影院宅| 久久久水蜜桃av免费网站| 91亚洲自偷观看高清| 亚洲伦乱视频| 欧美99久久| 午夜欧美精品| 国产一区二区高清| 久久国产精品毛片| 99国产精品视频免费观看一公开 | 夜夜嗨一区二区| 天堂8中文在线最新版在线| 日韩不卡一二三区| 精品日产乱码久久久久久仙踪林| 久久不见久久见免费视频7| 国产亚洲欧美日韩精品一区二区三区| 国产精品任我爽爆在线播放 | 久久国产日韩欧美精品| 久久亚洲精精品中文字幕| 欧美a一区二区| 中国字幕a在线看韩国电影| 97se综合| 久久久成人网| 久久亚洲国产| 欧美精品一线| 日韩国产高清在线| 久久不卡日韩美女| 91综合网人人| 激情综合网站| 伊人久久亚洲热| 婷婷综合电影| 国产欧美一区二区三区米奇| 美女久久99| 国产 日韩 欧美一区| 国产在线不卡| 日韩国产欧美一区二区三区| 国产精品chinese| 国产日本久久| 精品入口麻豆88视频| 婷婷综合六月| 亚洲欧美日韩综合国产aⅴ| 日韩精品视频网| 欧美激情麻豆| 偷拍精品精品一区二区三区| 亚洲国产福利| 中文字幕在线看片| 午夜在线视频一区二区区别| 涩涩涩久久久成人精品| 久久青青视频| 中文亚洲免费| 男女激情视频一区| 五月国产精品| 精品视频一二| 亚洲人成精品久久久| 久久av超碰|