黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java學(xué)習(xí) Java基礎(chǔ)學(xué)習(xí),泛型有什么用怎么用

Java基礎(chǔ)學(xué)習(xí),泛型有什么用怎么用

更新時間:2019-10-23 14:46:10 來源:動力節(jié)點 瀏覽2515次



只要了解了泛型的一般使用情況就能夠解決多半的問題。所以,首先我們來了解一下什么是泛型、為什么要使用它以及應(yīng)用方法。

什么是泛型?

試想一個簡單的添加方法(method),如下:

一篇文章告訴你如何使用Java泛型?

long,float 或 double 類型并不能當(dāng)作輸入傳給這個方法。

如果從該方法中抽象出數(shù)據(jù)類型,就可以得到一個新的方式,如下。

在這里,<T>是 泛型參數(shù)(也稱為類型變量),和給某一方法聲明的參數(shù)一樣。

給 <Integer> 或 <Double> 傳遞的泛型參數(shù)的值,與方法參數(shù)相似,叫做類型參數(shù)。

一篇文章告訴你如何使用Java泛型?

現(xiàn)在考慮數(shù)據(jù)結(jié)構(gòu),簡單起見,我們來想一想數(shù)組。我們能夠創(chuàng)建一個任意類型的數(shù)組嗎?不可以。我們只能創(chuàng)建一個整數(shù)數(shù)組、浮點數(shù)數(shù)組或者其他一種特定類型的數(shù)組。好了,忘掉所有編程語言里實現(xiàn)數(shù)組的方法,然后問一個問題:“我們是否可以從這個數(shù)據(jù)結(jié)構(gòu)中抽象出一種數(shù)據(jù)類型?”

一篇文章告訴你如何使用Java泛型?

答案是肯定的。Java 中的 ArrayList 就是做這件事的一種類。通過 List = new ArrayList<>(); 就能創(chuàng)建一個字符串?dāng)?shù)組,當(dāng)整數(shù)作為類型參數(shù)時,它就是整數(shù)數(shù)組,其他的也類似。

雖然我們用 ArrayList 作為例子,但由于其復(fù)雜性,我們不會討論他們具體是怎么實現(xiàn)的。我們會借鑒一個盒子并思考怎么把這個盒子做出來,而這個盒子就是某個特定類型的通用框架(a Generic box from a Specific Typed box)。

一篇文章告訴你如何使用Java泛型?

思考以下代碼,將一個字符串放進特定字符串框架(SpecifizedStringBox)對象中,然后以此獲得一個字符串。

一篇文章告訴你如何使用Java泛型?

現(xiàn)在,如果從該對象中抽取其數(shù)據(jù)類型“Type”,就得到一個由以下代碼代表的通用框架(GenericBox,也就是泛型),而該框架可以使用 String、Integer、Boolean 等任意數(shù)據(jù)類型。

一篇文章告訴你如何使用Java泛型?

所以,使用泛型,就是要從某個方法(method)或者類(class)中,抽象出一種適用于任意類型的通用方法/類。

為什么要用泛型?

簡單點的答案就是,通過泛型抽象數(shù)據(jù)類型后,你的代碼可以重復(fù)使用并且易于維護。

泛型應(yīng)用在什么地方?

看起來似乎通過重構(gòu)已有特定類型的方法或框架,就能應(yīng)用泛型。在處理數(shù)據(jù)結(jié)構(gòu)和原始數(shù)據(jù)類型時,似乎還挺容易,但是我們總會在各不相同的類中建立大量的數(shù)據(jù)類型。泛型編程模式(Generic Programming Paradigm)和 面向?qū)ο缶幊蹋∣OP)混合在一起時,就很難決定是否要使用泛型。理解在哪里應(yīng)用泛型,問題就解決了一半。

本文就將帶你了解一些典型的泛型用例,包括其使用場景,也可以讓你在遇到同類型問題時能夠合理應(yīng)用泛型。

Java 在 JDK 5.0 中引用泛型的目的在于:

  1. 類型安全性(Type safety):一旦使用類型參數(shù)后,在該方法或框架中就不存在其他的數(shù)據(jù)類型,同時也避免了類型轉(zhuǎn)化的需求;

  2. 通用編程及參數(shù)的多態(tài)性。

C++ 的模版編程能幫我們實現(xiàn)通用編程及參數(shù)的多態(tài)性,根據(jù)數(shù)據(jù)的類型(預(yù)定義或用戶定義的)轉(zhuǎn)化同樣的算法模型,達到復(fù)用同一個代碼或程序的目的。在 Java 中也可以使用類似的方法。

現(xiàn)在來看一下幾個常用的泛型用例。

用例 1 : 泛型的第一級別用法是算法和數(shù)據(jù)類型

算法和數(shù)據(jù)結(jié)構(gòu)并行,數(shù)據(jù)類型的微小變化可能會改變一個算法的復(fù)雜性。

數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)有類型,用泛型將這種類型抽取出來,可以作為類型參數(shù)。而算法的輸入?yún)?shù)也具有數(shù)據(jù)類型,同樣,通過泛型可以將該類型從輸入?yún)?shù)中抽象出來。因此,泛型適用于使用特定數(shù)據(jù)結(jié)構(gòu)的任意一種算法。

不過事實上,泛型主要用于 Java 的集合 API。

如果你自己寫數(shù)據(jù)結(jié)構(gòu),那么一定試試?yán)梅盒汀3薐ava 的集合 API,你也會在 Guava、Apache Common Collection、FastUtils、JCtools 和 Eclipse Collection 里發(fā)現(xiàn)其他對泛型更好的應(yīng)用。

用例 2 :數(shù)值輸入框或者單個元素的容器

具備可通用類型的數(shù)據(jù)結(jié)構(gòu),可以稱之為泛型框架(Generics Boxes)。例如 ArrayList、LinkedList 等等這樣的類就代表數(shù)據(jù)類型,同時為他們同類型的數(shù)據(jù)起著泛型框架的作用。

有時候,通用框架以單個元素而不是集合的形式出現(xiàn)。諸如 Map 映射中的輸入 <K, V>,節(jié)點 <K , V>,數(shù)據(jù)對 <K, V>,以及其他代數(shù)數(shù)據(jù)類型,像是可選項 <T> , 選擇 <U, V> 等等,它們只作為特定類型數(shù)據(jù)的依托(Holder)或封裝器(wrapper)而已。

ThreadLocal 和 AtomicReference 在適用于并發(fā)訪問算法的單元素容器中,是非常好的例子。

類似的用法有時合理,而有一些則不太適用。 一個盒子在早期確實可以容納任何類型的物品,但現(xiàn)在會將其進行分類:這個盒子用來裝玩具,而下一個盒子用來裝筆,等等。

一篇文章告訴你如何使用Java泛型?

杯子是很好的例子,可以把它比做實時對象類型的依托物(Holder),它可以裝茶、咖啡或者任何飲料。公交上可以坐男人和女人,如果讓公交具備類型安全性且只允許女人上車,那么我們可以稱之為女士公交。這種比喻可能有點欠妥,但它提出了商業(yè)用例,尤其是封裝器或者依托物也具有應(yīng)用泛型的可能。嘗試詢問業(yè)務(wù)的封裝或依托是否有使用數(shù)據(jù)結(jié)構(gòu)的傾向,如果有,那么使用泛型會更好。

一篇文章告訴你如何使用Java泛型?

用例類型 3 :抽象類型的泛型工具方法

泛型算法不一定總是和特定的數(shù)據(jù)結(jié)構(gòu)或算法綁定在一起。有時,基于實際應(yīng)用的滿意度,它還可以應(yīng)用在大多數(shù)抽象數(shù)據(jù)結(jié)構(gòu)組中。

在 Java 中就有該Collections工具類。

查看以下方法,了解什么方法能適用:

Collection Factories Methods, Empty/Singleton

  • emptyList, emptyMap, emptySet

  • singleton, singletonList, singletonMap

封裝方法(Synchronized, UnModifiable, Checked Collection):

  • synchronizedCollection, synchronizedSet, synchronizedMap

  • unmodifiableCollection, unmodifiableSet, unmodifiableList

  • checkedCollection, checkedList, checkedSet

還有一些泛型方法,可歸為四大類:

1. 更改列表中的元素順序:reverse,rotate,shuffle,sort,swap;

2. 更改列表內(nèi)容:copy, fill, replaceAll;

3. 在集合中尋找極值:最大值,最小值;

4. 在列表中查找特定值:binarySearch,indexOfSubList,lastIndexOfSubList。

由于他們適用于列表中的任意類型,這些都是可復(fù)用的功能。我們會發(fā)現(xiàn),大多數(shù)集合都適用泛型方法。

用例類型 4 :泛型方法用于類的分層并行結(jié)構(gòu)中

Spring 框架中的 JpaRepository、CrudRepository 都已使用泛型構(gòu)建,創(chuàng)建、更新、查找、查找所有、刪除等等,是適用于所有實體的泛型方法。

需要給每個實體創(chuàng)建一個并行數(shù)據(jù)訪問對象(DAO)類時,會出現(xiàn)類的分層并行結(jié)構(gòu)(parallel hierarchy of classes)。 不過 DAO 模式并不是其出現(xiàn)的唯一情況。

如果為了提供更多可能的方法實例,我們可以通過將方法與對象解除聯(lián)系的方式,來應(yīng)用策略模式(Strategy Pattern)處理業(yè)務(wù)問題,這時類的分層并行結(jié)構(gòu)就會出現(xiàn)。

每當(dāng)我們添加一個新類,就會增加一個并行的測試用例。如果需要工廠,我們就添加一個并行工廠類。 類的分層并行結(jié)構(gòu)出現(xiàn)在業(yè)務(wù)用例中。試想一輛新車,比如“大巴車”,把它添加到以下的車輛層級中時,可能還需要添加一個“大巴車司機”的類。

一篇文章告訴你如何使用Java泛型?

一篇文章告訴你如何使用Java泛型?

來看以下分層并行類和其泛型的例子:

一篇文章告訴你如何使用Java泛型?

一篇文章告訴你如何使用Java泛型?

用例類型 5 : 創(chuàng)建類型安全的異構(gòu)容器

集合 <String> 是均質(zhì)容器的一個示例,任何字符串以外的東西都不能放進該框架里。而集合 <Object> 是異構(gòu)容器的一個例子,可以放入任意對象。集合 <Object> 便不是類型安全的,需要檢查類型、進行轉(zhuǎn)換,類似于原始類型的集合(原始類型是沒有泛型類型參數(shù)的通用類型,它將對象視為默認(rèn)的類型參數(shù))。Java 沒有為類型安全的異構(gòu)容器提供第一級別的支持。

在集合 <String> 中,類型參數(shù)“String”被用作類型參數(shù)“T”,以確保類型安全。但是對于 Map<String, String>,它卻有兩個類型參數(shù),通過之前Java 集合 API 的例子,通常泛型會限制每個容器類型參數(shù)的數(shù)量為一個定值。可以將類型參數(shù)設(shè)置在Map映射的鍵(key)上,而不是容器上,從而繞過這個限制。在建立類型安全的異構(gòu)容器/Map映射時,利用類對象作為鍵。

像是 bean 容器,異常處理程序容器,或服務(wù)查找容器都是異構(gòu)容器的示例,都可以使用泛型來進行類型安全化,方法既使用類對象作為鍵實現(xiàn)動態(tài)轉(zhuǎn)換。

以上就是動力節(jié)點java培訓(xùn)機構(gòu)小編介紹的“Java基礎(chǔ)學(xué)習(xí),泛型有什么用怎么用”的內(nèi)容,希望對的大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 天天澡夜夜澡狠狠澡 | 91成人在线播放 | 日本三级午夜 | 中国大陆毛片 | 黄色一级网 | 精品国产一区二区三区www | 欧美激情一区二区三级高清视频 | 在线观看你懂得 | 91免费看国产 | 99久久综合| 三级第一页 | 久久精品国产久精国产果冻传媒 | 久青草视频免费视频播放线路1 | 亚洲欧美日韩国产精品26u | 涩涩网页 | 一道本在线视频 | 亚洲欧美视频在线播放 | 高h辣肉各种姿势爽文bl | 性欧美极品xxxx欧美一区二区 | 丝袜美女在线播放 | 成年视频国产免费观看 | 深夜在线网址 | 久久久久久一级毛片免费野外 | 在线观看黄a大片爽爽影院免费 | 手机看片日本 | 欧美激情人成日本在线视频 | 人喾交性专区免费看 | 久久精品免视看国产明星 | 亚洲国产成人久久一区久久 | 亚洲国产黄色 | 曰皮全部过程免费视频 | 高清性色生活片免费视频软件 | 免费观看黄色毛片 | 欧美大成色www永久网站婷 | 中文字幕日韩精品麻豆系列 | 午夜国产福利在线 | 香蕉黄色片 | 亚洲成a人片77777老司机 | 视频一区二区三区在线观看 | 一区二区三区免费在线观看 | 一本大道香蕉在线影院 |