Java,泛型

目錄

泛型的理解:

在ArrayList中使用泛型:

在Map中使用泛型:

在接口中使用泛型:

自定義泛型類/接口與自定義泛型方法

自定義類/接口:

關于泛型類的子類:

注意點:

注意點:

自定義泛型方法:

泛型在繼承上的體現以及通配符的使用:

泛型在繼承上的體現:

通配符的使用:

關于使用通配符的類的對象的操作:

有限制條件的通配符:


泛型的理解:

泛型,就是允許在定義類、接口時通過一個標識表示類中某個屬性的類型或某個方法的返回值或參數的類型。這個類型參數將在使用時(例如,繼承或實現這個接口、創建對象或調用方法時)確定(即傳入實際的類型參數,也稱為類型實參)。

集合中不使用泛型可能會:

·類型不安全,因為add( )在沒有泛型時參數是Object類型的意味著任何類型的對象都可以添加成功。

·需要頻繁地進行強轉操作。可能會出現類型轉換異常。

在集合中使用泛型:

在ArrayList中使用泛型:

List<Integer> ll = new ArrayList<Integer>();
ll.add(78);
ll.add(89);
ll.add(80);
ll.add(34);Iterator<Integer> ii = ll.iterator();
while(ii.hasNext())
{Integer i = ii.next();int score = i;System.out.println(i);
}

此處用泛型限制ll集合中只能添加Integer類型的參數。

new對象時的后面的<>里的泛型的類型可以不寫,因為會通過前面的聲明處的泛型類型自行推斷。

在Map中使用泛型:

//jdk7的特性,類型推斷,即以下的后面的尖括號不用寫泛型類型,會自行推斷。HashMap<String,Integer> map = new HashMap<>();map.put("aa",11);map.put("bb",22);map.put("cc",33);//        Iterator<Map.Entry<String,Integer>> ii = map.entrySet().iterator();
//        while(ii.hasNext())
//        {
//           Map.Entry<String,Integer> ee = ii.next();
//            System.out.println(ee.getKey() + "-->" + ee.getValue());
//        }//var也屬于類型推斷。var ii = map.entrySet().iterator();while(ii.hasNext()){var ee = ii.next();System.out.println(ee.getKey() + "-->" + ee.getValue());}}

此處的map的調用entrySet之后的返回值對象的類型應該是Map.Entry<String,Integer>類型,所以泛型里的類型應該是Map.Entry<String,Integer>,在新特性中,可以使用var代替聲明,進行類型推斷。

jdk5.0中,集合框架在聲明接口和實現類時,使用了泛型,在實例化集合對象時,如果沒有使用泛型,則認為操作的時Object類型的數據。如果使用了泛型,則需要指明泛型的具體類型。一旦指明了泛型的具體類型則在集合的相關方法中凡是使用泛型的位置,都替換為具體的泛型類型。

在接口中使用泛型:

例如,在聲明處實現Comparable和Comparator時,加上<>,并指明泛型類型,相應的CompareTo方法和Compare方法的參數也就與泛型的參數一致,只能限制為指定的類型。

自定義泛型類/接口與自定義泛型方法

自定義類/接口:

class A<T>{

}

interface B<T>{

}

說明(以泛型類為例):

泛型類實例化時,若不指明相關的泛型參數類型,則默認為泛型參數的類型為Object類型。實例化時,可以指明泛型參數的類型,一旦指明了泛型的類型,則在泛型類中使用泛型參數的位置,都替換為指定的類型。

關于泛型類的子類:

若父類Order的聲明為:
public class Order<T>
關于泛型類的子類的聲明,主要有五種情況(以下的父類都是指某個泛型類):
①子類和父類名處都不寫<> :
public class SubOrder extends Order
此時的 SubOrder 不是泛型類,相當于繼承已經確定了泛型參數類型為 Object Order。
②子類名處不寫<>,父類名處的<>里指明類型。
public class SubOrder2 extends Order<Integer>
也不是泛型類,因為繼承的是已經指明了泛型參數類型為 Integer Order ,已經確定了指定的地方的類型就是 Integer
③子類和父類名處都寫<>,且其中內容都是相同的不指明類型的參數(比如都為T)。
public class SubOrder3<T> extends Order<T>
此時的子類是泛型類, 此時的兩個 T 是相對應的。父類中用泛型參數 T 限制的地方繼承到子類還是按相應 T的類型來確定。
④子類名和父類名處都寫<>,子類中的<>是不指明類型的參數,父類中的<>指明參數類型。
public class SubOrder4<E> extends Order<Integer>
此時的子類是泛型類,繼承時,父類中的使用泛型參數的地方繼承到子類后,泛型參數變為了上面 extend 聲明后面的 <> 中的類型。而 <E> 是指子類中其他的地方要用到泛型來限制類型,與 extend 后面的 <>的內容無關。
⑤子類和父類名處都寫<>,且其中有內容都是相同的不指明類型的參數的基礎上,子類名處的<>中,用逗號分隔,加上其他的不指明類型的參數。
public class SubOrder5<T,V> extends Order<T>
此時的前后兩個 T 是相對應的。而 V 是子類中除 T 之外有其他的地方要用到泛型來限制類型,父類中繼承過來的需要用 T 來限制類型的由 T 決定, V則限制子類中相應的其他地方的類型。

注意點

①聲明完自定義泛型類以后,可以在類的內部(比如:屬性、方法、構造器中)使用類的泛型。

②創建自定義泛型類的對象時,可以指明泛型參數類型。一旦指明,內部凡是使用類的泛型參數的位置,都具體化為指定的類的泛型類型。

③如果在創建自定義泛型類的對象時,沒有指明泛型參數類型,那么泛型將被擦除,泛型對應的類型均按照Object處理,但不等價于Object。

④泛型的指定中必須使用引用數據類型。不能使用基本數據類型,此時只能使用包裝類替換。

⑤除創建泛型類對象外,子類繼承泛型類時、實現類實現泛型接口時,也可以確定泛型結構中的泛型參數。如果給泛型類提供子類時,子類也不確定泛型的類型,則可以繼續使用泛型參數。還可以在現有的父類的泛型參數的基礎上,新增泛型參數。

注意點:

①泛型類可能有多個參數,此時應將多個參數一起放在尖括號內。比如:<E1,E2,E3>

②JDK7.0開始,泛型的簡化操作:ArrayList<Fruit>?flist=?new?ArrayList<>( );

③如果泛型結構是一個接口或抽象類,則不可創建泛型類的對象。

④不能使用new?E[ ]。但是可以:E[ ]?elements?=(E[ ])new?object[capacity];

參考:ArrayList源碼中聲明:Object[ ] elementData,而非泛型參數類型數組。

⑤在類/接口上聲明的泛型,在本類或本接口中即代表某種類型,但不可以在靜態方法中使用類的泛型。

⑥異常類不能是帶泛型的。

自定義泛型方法:

格式:

權限修飾符 <E> 返回值類型 方法名(形參列表){?????????//通常在形參列表或返回值類型的位置會出現泛型參數T

}

說明:

①聲明泛型方法時一定要添加泛型參數<T>

②泛型參數在調用時指明具體的參數類型

③泛型方法可以根據需要聲明為靜態的

④泛型方法在泛型類或不是泛型類都可以。

泛型在繼承上的體現以及通配符的使用:

泛型在繼承上的體現:

G<superA>與G<A>(若superA是A的父類)并沒有子父類的關系,它們是兩個并列的無關聯類,不能體現多態性。

SuperA<E>與A<E>的關系是子父類的關系,可以體現多態性。

通配符的使用:

通配符:?

格式:A<?>? ? ?(若A是一個泛型類)

此格式代表不確定A的泛型類型的類型,此類型是A的所有確定泛型類型的類型的父類,可以與其他確定泛型類型的類型體現多態性。

關于使用通配符的類的對象的操作:

讀取數據:由于讀取的數據類型不確定,所以讀取的數據的操作都是返回Object類型。

寫入數據:由于數據類型不確定,使用通配符的類的對象不能寫入數據(特例,可以添加null),只能通過多態性接收其他對象的數據。

接受其他對象的數據:可以看作將A<E>的對象賦值給G<?>的引用。

有限制條件的通配符:

A<? extend B> :可以將A<B的子類或B類>的對象賦值給A<? extend B>的引用。

A<? super B> :可以將A<B的父類或B類>的對象賦值給A<? super B>的引用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162635.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162635.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162635.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MATLAB實現灰色預測

久違了&#xff0c;前段時間由于學習壓力大&#xff0c;就沒怎么更新MATLAB相關的內容&#xff0c;今天實在學不進去了&#xff0c;換個內容更新一下~ 本貼介紹灰色預測模型&#xff0c;這也是數學建模競賽常見算法中的一員&#xff0c;和許多預測模型一樣——底層原理是根據已…

監控員工上網有什么軟件丨三款好用的員工上網管理軟件推薦

監控員工上網行為是企業管理中不可或缺的一部分&#xff0c;因此&#xff0c;選擇一款好的監控員工上網的軟件至關重要。目前市場上存在多種監控員工上網的軟件&#xff0c;它們具有各種特點和功能&#xff0c;但企業需要仔細評估和選擇。 一、域之盾軟件 這是一款優秀的監控員…

利用GenericMenu創建上下文菜單或下拉菜單

使用GenericMenu 創建自定義上下文菜單和下拉菜單豐富自己的編輯器功能。 GenericMenu 介紹 變量 allowDuplicateNames 允許菜單具有多個同名的菜單項。 公共函數 AddDisabledItem 向菜單添加已禁用的項。 AddItem 向菜單添加一個項。 AddSeparator 向菜單添加一個分隔符項…

grafana二次啟動失敗

背景 安裝grafana后啟動使用正常&#xff0c;但是關機后再啟動顯示啟動失敗&#xff0c;但是看日志又沒有報錯信息&#xff0c;但是就是啟動不了 原因分析 其實是/var/lib/grafana/grafana.db文件損壞了&#xff0c;所以需要把這個文件刪掉之后重新啟動就正常了&#xff0c;…

如何在AppLink配置金蝶云星空預算使用單流程

上一篇有提到金蝶云星空如何通過AppLink平臺配置銷售訂單操作&#xff0c;這次來演示下如何“保存預算使用單”、“調撥單定時自動審核”以及“預算使用單反審核后刪除”操作。 根據請求數據保存預算使用單 當webhook接收到數據時觸發流程 步驟1&#xff1a;根據webhook的請…

OpenGL YUV 和 RGB 圖像相互轉換出現的偏色問題怎么解決?

未經作者(微信ID:Byte-Flow)允許,禁止轉載 文章首發于公眾號:字節流動 早上知識星球里的一位同學,遇到 yuv2rgb 偏色問題,這個問題比較典型,今天展開說一下。 省流版 首先 yuv2rgb 和 rgb2yuv 之間的轉換要基于相同的標準,轉換使用不同的標準肯定會引起偏色,常見的…

短視頻矩陣系統源碼搭建部署分享

一、 短視頻矩陣系統源碼搭建部署分享 目錄 一、 短視頻矩陣系統源碼搭建部署分享 二、短視頻矩陣系統搭建功能設計 三、 抖音矩陣號矩陣系統功能設計原則 四、 短視頻矩陣開發部分源碼展示 很高興能夠幫助您&#xff0c;以下是短視頻矩陣系統源碼搭建部署分享&#xff1a…

怎么快速卸載office365

怎么快速卸載office365 根據官網提供的兩種解決方案即點即用或MSIMicrosoft Store 根據官網提供的兩種解決方案 官網地址&#xff1a;https://support.microsoft.com/zh-cn/office/%E4%BB%8E-pc-%E5%8D%B8%E8%BD%BD-office-9dd49b83-264a-477a-8fcc-2fdf5dbf61d8#OfficeVersio…

sql經典練習(包括運行通過代碼)

建庫 導入數據庫并運行 # 學生表 Student&#xff1a; ? create table Student( ? SId varchar(10) , ? Sname varchar(10), ? Sage datetime, ? Ssex varchar(10)); ? insert into Student values(01 , 趙鐵柱 , 1990-01-01 , 男); ? insert into Student values(02 …

智能優化算法 | Matlab實現金豺優化算法(GJO)(內含完整源碼)

文章目錄 效果一覽文章概述源碼設計參考資料效果一覽 文章概述 智能優化算法 | Matlab實現金豺優化算法(GJO)(內含完整源碼) 源碼設計 %%clear clc close SearchAgents_no=30; % Number of search agents Max_iteration=1000

PHP 正則式 全能匹配URL(UBB)

PHP 正則式 全能匹配URL&#xff08;UBB&#xff09; 語言&#xff1a;PHP 注明&#xff1a;正則式 無語言限制&#xff08;js、PHP、JSP、ASP、VB、.net、C#...&#xff09;一切皆可。 簡介&#xff1a;PHP UBB 正則式 全能匹配URL 自動加超級鏈接。網上找了很多都不匹配或…

數字化轉型過程中面臨最大的問題是什么?如何借助數字化工具實現快速轉型?

在科技快速發展的時代&#xff0c;數字化轉型已經成為企業的重要戰略。當企業努力適應數字化時代并取得成功時&#xff0c;他們可能會面臨各種必須有效應對的挑戰。   數字化轉型不僅僅是將新技術應用到企業的運營中&#xff0c;還需要對企業的運營方式、與客戶的互動方式和價…

數字人直播系統開發要注意的陷阱

數字人做為元宇宙的底層基座&#xff0c;BAT都在跑步進場&#xff0c;目前具有前瞻性的公司都在布局數字人產業。數字人可以應用于很多業務場景&#xff0c;對今年來說&#xff0c;無疑數字人直播系統是最火的。像去年數字人直播SAAS系統定制開發的話沒有個百把萬是下不來的。但…

求臻醫學六周年,我們的故事值得被記錄

6載光陰求臻醫學持續以科技創新推動產業升級在腫瘤精準診療領域持續深耕致力于為腫瘤患者生命續航每一位求臻人都是我們前進的力量也是我們不斷創新的源泉我們不拘泥于一種聲音以多元化的視角探索前行

app小程序定制的重點|軟件定制開發|網站搭建

app小程序定制的重點|軟件定制開發|網站搭建 App小程序定制開發是近年來快速發展的一項技術服務&#xff0c;隨著移動互聯網的普及和用戶需求的不斷升級&#xff0c;越來越多的企業和個人開始關注和需求定制化的小程序開發。那么&#xff0c;對于app小程序定制開發來說&#xf…

基于枚舉實現的橋接模式

基于枚舉實現的橋接模式 這里是基于枚舉方式來維護的橋接模式&#xff0c;維護抽象化和實現化的關系。 橋接模式的應用場景&#xff1a; 當一個類內部具備兩種或多種變化維度時&#xff0c;使用橋接模式可以解耦這些變化的維度&#xff0c;使高層代碼架構穩定。 橋接模式通常…

【微信小程序】繪制二維碼實現及解決canvas層級問題最佳實踐

前言 很久沒寫微信小程序的需求了&#xff0c;今天來活兒要做個二維碼掃碼相關的需求&#xff0c;本來以為是灑灑水的事情&#xff0c;誰知道也折磨了大半天&#xff0c;今天特此記錄一下~ 需求&#xff1a;點擊按鈕&#xff0c;彈出二維碼&#xff0c;二維碼內容固定為test …

獨孤思維:不喜愛的再賺錢也別碰,因為你愛無能

很多人都說什么工作收入高做什么&#xff1b; 很多女人說哪個男人有錢嫁哪個&#xff1b; 很多粉絲說什么項目賺錢做什么。 本質上不是你愛這個工作&#xff0c;愛這個男人&#xff0c;愛這個項目。 而是你愛錢。 但是愛錢&#xff0c;要付出代價。 工作收入高&#xff0…

Dubbo框架

1&#xff1a;簡介 Dubbo 是阿里巴巴公司開源的一個Java高性能優秀的服務框架 Apache Dubbo 是一款 RPC 服務開發框架&#xff0c;用于解決微服務架構下的服務治理與通信問題 這是Dubbo官網的介紹&#xff0c;下面是我對這dubbo的理解 首先介紹下什么是RPC&#xff1a; 常…

為什么說品牌低價不是一件好事

消費者貨比三價為的是買到低價質優的產品&#xff0c;而網絡電商平臺的公開&#xff0c;也促進了消費者及品牌進行比價&#xff0c;那品牌低價一定就是好事嗎&#xff0c;一定會拉高品牌銷量嗎。其實是不一定的&#xff0c;低價意味著成本的降低&#xff0c;也可能滋生很多產品…