真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java中使用泛型屏蔽類型的差異性是什么

這篇文章主要為大家展示了“java中使用泛型屏蔽類型的差異性是什么”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“java中使用泛型屏蔽類型的差異性是什么”這篇文章吧。

創(chuàng)新互聯(lián)建站擁有網(wǎng)站維護(hù)技術(shù)和項(xiàng)目管理團(tuán)隊(duì),建立的售前、實(shí)施和售后服務(wù)體系,為客戶提供定制化的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站維護(hù)、西部信息服務(wù)器托管解決方案。為客戶網(wǎng)站安全和日常運(yùn)維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護(hù)服務(wù)覆蓋集團(tuán)企業(yè)、上市公司、外企網(wǎng)站、電子商務(wù)商城網(wǎng)站建設(shè)、政府網(wǎng)站等各類型客戶群體,為全球上1000+企業(yè)提供全方位網(wǎng)站維護(hù)、服務(wù)器維護(hù)解決方案。

使用泛型屏蔽類型的差異性

在C++語(yǔ)言中,有個(gè)很好用的模板(template)功能,可以編寫帶有參數(shù)化類型的通用版本,讓編譯器自動(dòng)生成針對(duì)不同類型的具體版本。而在Java語(yǔ)言中,也有一個(gè)類似的功能叫泛型(generic)。在編寫類和方法的時(shí)候,一般使用的是具體的類型,而用泛型可以使類型參數(shù)化,這樣就可以編寫更通用的代碼。

許多人都認(rèn)為,C++模板(template)和Java泛型(generic)兩個(gè)概念是等價(jià)的,其實(shí)實(shí)現(xiàn)機(jī)制是完全不同的。C++模板是一套宏指令集,編譯器會(huì)針對(duì)每一種類型創(chuàng)建一份模板代碼副本;Java泛型的實(shí)現(xiàn)基于"類型擦除"概念,本質(zhì)上是一種進(jìn)行類型限制的語(yǔ)法糖。

1.泛型類

以支撐類為例,定義泛型的通用支撐類:

/** 通用支撐類 */@Getter@Setter@ToStringpublic class GenericHolder {    /** 通用取值 */
    private T value;    /** 構(gòu)造函數(shù) */
    public GenericHolder() {}    /** 構(gòu)造函數(shù) */
    public GenericHolder(T value) {        this.value = value;
    }
}

2.泛型接口

定義泛型的數(shù)據(jù)提供者接口:

/** 數(shù)據(jù)提供者接口 */public interface DataProvider {    /** 獲取數(shù)據(jù)函數(shù) */
    public T getData();
}

3.泛型方法

定義泛型的淺拷貝函數(shù):

/** 淺拷貝函數(shù) */public static  T shallowCopy(Object source, Class clazz) throws BeansException {    // 判斷源對(duì)象
    if (Objects.isNull(source)) {        return null;
    }    // 新建目標(biāo)對(duì)象
    T target;    try {
        target = clazz.newInstance();
    } catch (Exception e) {        throw new BeansException("新建類實(shí)例異常", e);
    }    // 拷貝對(duì)象屬性
    BeanUtils.copyProperties(source, target);    // 返回目標(biāo)對(duì)象
    return target;
}

4.泛型通配符

泛型通配符一般是使用"?"代替具體的類型實(shí)參,可以把"?"看成所有類型的父類。當(dāng)具體類型不確定的時(shí)候,可以使用泛型通配符 "?";當(dāng)不需要使用類型的具體功能,只使用Object類中的功能時(shí),可以使用泛型通配符 "?"。

/** 打印取值函數(shù) */public static void printValue(GenericHolder holder) {
    System.out.println(holder.getValue());
}/** 主函數(shù) */public static void main(String[] args) {
    printValue(new GenericHolder<>(12345));
    printValue(new GenericHolder<>("abcde"));
}

在Java規(guī)范中,不建議使用泛型通配符"?",上面函數(shù)可以改為:

/** 打印取值函數(shù) */public static  void printValue(GenericHolder holder) {
    System.out.println(holder.getValue());
}

5.泛型上下界

在使用泛型的時(shí)候,我們還可以為傳入的泛型類型實(shí)參進(jìn)行上下界的限制,如:類型實(shí)參只準(zhǔn)傳入某種類型的父類或某種類型的子類。泛型上下界的聲明,必須與泛型的聲明放在一起 。

上界通配符(extends):

上界通配符為”extends”,可以接受其指定類型或其子類作為泛參。其還有一種特殊的形式,可以指定其不僅要是指定類型的子類,而且還要實(shí)現(xiàn)某些接口。例如:List表明這是A某個(gè)具體子類的List,保存的對(duì)象必須是A或A的子類。對(duì)于List列表,不能添加A或A的子類對(duì)象,只能獲取A的對(duì)象。

下界通配符(super):

下界通配符為”super”,可以接受其指定類型或其父類作為泛參。例如:List表明這是A某個(gè)具體父類的List,保存的對(duì)象必須是A或A的超類。對(duì)于List列表,能夠添加A或A的子類對(duì)象,但只能獲取Object的對(duì)象。

PECS(Producer Extends Consumer Super)原則:
作為生產(chǎn)者提供數(shù)據(jù)(往外讀?。r(shí),適合用上界通配符(extends);
作為消費(fèi)者消費(fèi)數(shù)據(jù)(往里寫入)時(shí),適合用下界通配符(super)。

在日常編碼中,比較常用的是上界通配符(extends),用于限定泛型類型的父類。例子代碼如下:

/** 數(shù)字支撐類 */@Getter@Setter@ToStringpublic class NumberHolder {    /** 通用取值 */
    private T value;    /** 構(gòu)造函數(shù) */
    public NumberHolder() {}    /** 構(gòu)造函數(shù) */
    public NumberHolder(T value) {        this.value = value;
    }
}/** 打印取值函數(shù) */public static  void printValue(GenericHolder holder) {
    System.out.println(holder.getValue());
}

以上是“java中使用泛型屏蔽類型的差異性是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


分享題目:java中使用泛型屏蔽類型的差異性是什么
文章來(lái)源:http://weahome.cn/article/gggscs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部