泛型(Generic)

為什么要有泛型?

1.解決元素存儲的安全性問題

2.解決獲取數據元素時,需要類型強轉的問題

服用前:

服用后:

?

  ? 泛型,JDK1.5新加入的,解決數據類型的安全性問題,其主要原理是在類聲明時通過一個標識表示類中某個屬性的類型或者是某個方法的返回值及參數類型。這樣在類聲明或實例化時只要指定好需要的具體的類型即可。

??????? Java泛型可以保證如果程序在編譯時沒有發出警告,運行時就不會產生ClassCastException異常。同時,代碼更加簡潔、健壯。

使用泛型

泛型的聲明

  interface List<T>和class TestGen<K,V>

其中,T,K,V不代表值,而是表示類型。這里使用任意字母都可以。常用T表示,是Type的縮寫。

泛型的實例化:

一定要在類名后面指定類型參數的值(類型)。如:

List<String> StrList = new ArrayList<String>();

iterator<Customer> iterator = customers.iterator();

  T只能是類,不能用基本數據類型填充。

泛型的幾個重要使用

1.在集合中使用泛型

2.自定義泛型類

3.泛型方法

4.泛型接口

對于泛型類

1.對象實例化時不指定泛型,默認為:Object

2.泛型不同的引用不能相互賦值。

3.加入集合中的對象類型必須與指定的泛型類型一致。

4.靜態方法中不能使用類的泛型。

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

6.不能在catch中使用泛型

7.從泛型類派生子類,泛型類型需具體化

自定義泛型類

 1 class Person<T>{
 2     //使用T類型定義變量
 3     private T info;
 4     //使用T類型定義一般方法
 5     public T getInfo(){
 6         return info;
 7     }
 8     public void setInfo(T info){
 9         this.info=info;
10     }
11     //使用T類型定義構造器
12     public Person(){}
13     public Person(T info){
14         this.info=info;
15     }
16     //static的方法中不能聲明泛型
17 //    public static void show(T t){
18 //        
19 //    }
20     //try{}
21     //catch(T t){}
22 }

對于泛型方法

方法,也可以被泛型化,不管此時定義在其中的類是不是泛型化的。在泛型方法中可以定義泛型參數,此時,參數的類型就是傳入數據的類型。

泛型方法的格式:

[訪問權限]<泛型>返回類型 方法名([泛型標識 參數名稱])拋出的異常

public class DAO{

  public<E> E get(int id,E e){

  E result = null;

  return result;

}

}

static <T> void fromArrayToCollection(T[] a, Collection<T> c) {

? for (T o : a) {

? c.add(o);

? }? }

?

public static void main(String[] args) {

? Object[] ao = new Object[100];

? Collection<Object> co = new ArrayList<Object>();

? fromArrayToCollection(ao, co);

?

? String[] sa = new String[20];

? Collection<String> cs = new ArrayList<>();

? fromArrayToCollection(sa, cs);

?

? Collection<Double> cd = new ArrayList<>();

? // 下面代碼中T是Double類,但sa是String類型,編譯錯誤。

? // fromArrayToCollection(sa, cd);

? // 下面代碼中T是Object類型,sa是String類型,可以賦值成功。

? fromArrayToCollection(sa, co);? }

泛型和繼承的關系

如果B是A的一個子類型(子類或者子接口),而G是具有有泛型聲明的類或接口,G<B>并不是G<A>的子類型!

比如:String是Object的子類,單List<String>并不是List<Object>的子類

通配符

1.使用類型通配符:?

比如:List<?>,Map<?,?>

List<?>是List<String>、List<Object>等各種泛型List的父類。

2.讀取List<?>的對象list中的元素時,永遠是安全的,因為不管list的真實類型是什么,它包含的都是Object。

3.寫入list中的元素時,不行。因為我們不知道c的元素類型,我們不能向其中添加對象。

  唯一的例外是null,它是所有類型的成員。

將任意元素加入到其中不是類型安全的:

Collection<?> c=new ArrayList<String>();

c.add(new Object());//編譯時錯誤

因為我們不知道c的元素類型,我們不能向其中添加對象

  add方法有類型參數E作為集合的元素類型。我們傳給add的任何參數都必須是一個未知類型的子類。因為我們不知道那是聲明類型,所以我們無法傳遞任何東西進去。

唯一的例外是null,它是所有類型的成員。

另一方面,我們可以調用get()方法并使用其返回值。返回值是一個未知的類型,但是我們知道,它總是一個Object

有限制的通配符

<?>

允許所有泛型的引用調用

舉例:

<? extends Number>???? (無窮小 , Number]

只允許泛型為Number及Number子類的引用調用

?

<? super Number>????? [Number , 無窮大)

只允許泛型為Number及Number父類的引用調用

?

<? extends Comparable>

只允許泛型為實現Comparable接口的實現類的引用調用

?

轉載于:https://www.cnblogs.com/liangxiaoyu/p/5137614.html

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

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

相關文章

官宣!DevExpress Blazor UI組件,支持全新的.NET 8渲染模式

DevExpress Blazor UI組件使用了C#為Blazor Server和Blazor WebAssembly創建高影響力的用戶體驗&#xff0c;這個UI自建庫提供了一套全面的原生Blazor UI組件&#xff08;包括Pivot Grid、調度程序、圖表、數據編輯器和報表等&#xff09;。 .NET 8為Blazor引入了令人興奮的重…

linux內核源碼樹

linux內核源碼樹掃盲分析 sudo apt-get install tree //下載tree tree //輸入指令(該指令可以檢查第三方工具包里的內容是否完整)可以看到如圖的樹狀結構&#xff1a; linux內核源碼&#xff1a; 為什么內核大約1.3w個c文件&#xff0c;1100w行代碼&#xff1f; linux是一個開…

POJ 2676/2918 數獨(dfs)

思路&#xff1a;記錄每行每列每一個宮已經出現的數字就可以。數據比較弱 另外POJ 3074 3076 必須用剪枝策略。但實現較麻煩&#xff0c;還是以后學了DLX再來做吧 //Accepted 160K 0MS #include<cstdio> #include<iostream> #include<algorithm> #include&l…

負載均衡很難?看完這篇全懂了

來自&#xff1a;金鐘路上小碼工鏈接&#xff1a;https://www.cnblogs.com/danbing/p/7459224.html一、什么是負載均衡&#xff1f;互聯網早期&#xff0c;業務流量比較小并且業務邏輯比較簡單&#xff0c;單臺服務器便可以滿足基本的需求&#xff1b;但隨著互聯網的發展&#…

配置樹莓派linux的內核和編譯并將鏡像拷貝至樹莓派

驅動代碼的編寫需要一個提前編譯好的內核&#xff0c;編譯內核就必須配置&#xff0c;配置的最終目標會生成.config文件&#xff0c;該文件指導makefile去把有用的東西組織成內核。 如何生成.config文件&#xff1a; 第一種方式&#xff1a; 廠家配linux內核源碼&#xff0c;比…

h5 與原生 app 交互的原理

作者&#xff1a;senntyousegmentfault.com/a/1190000016759517現在移動端 web 應用&#xff0c;很多時候都需要與原生 app 進行交互、溝通&#xff08;運行在 webview中&#xff09;&#xff0c;比如微信的 jssdk&#xff0c;通過 window.wx 對象調用一些原生 app 的功能。所以…

(原)直方圖的相似性度量

轉載請注明出處&#xff1a; http://www.cnblogs.com/darkknightzh/p/5147982.html 對于兩直方圖 $S\left\{ {{s}_{1}},\cdots {{s}_{n}} \right\}$ 及 $M\left\{ {{m}_{1}},\cdots {{m}_{n}} \right\}$&#xff0c;n為直方圖維數&#xff08;如255&#xff09;&#xff0c;這兩…

【ROS問題】rqt_plot運行報錯

本人Linux版本&#xff1a;Ubuntu 18.04 LTS ROS版本&#xff1a;Melodic 方案一&#xff1a; 你看那個報錯&#xff0c;全是Matplotlib的報錯&#xff0c;是這個東西版本不夠高&#xff0c;重新安裝就好啦。 python -m pip install -U pip python -m pip install -U matp…

BCP使用筆記整理

一、BCP 簡介大容量復制程序實用工具 (bcp) 可以在 Microsoft SQL Server 實例和用戶指定格式的數據文件間大容量復制數據。 使用 bcp 實用工具可以將大量新行導入 SQL Server 表&#xff0c;或將表數據導出到數據文件。 除非與 queryout 選項一起使用&#xff0c;否則使用該實…

怎樣基于谷歌地圖的Server緩存公布Image Service服務

怎樣基于谷歌地圖的Server緩存公布Image Service服務第一步&#xff1a;下載地圖數據下載安裝水經注萬能地圖下載器&#xff0c;啟動時僅僅選擇電子.谷歌&#xff08;這里能夠依據自己的須要選擇&#xff09;。例如以下圖所看到的。找到成都后框選下載成都區域&#xff0c;例如…

ROS文件系統介紹

預備工作 本教程中我們將會用到ros-tutorials程序包&#xff0c;請先安裝&#xff1a; sudo apt-get install ros-<distro>-ros-tutorials快速了解文件系統概念 Packages: 軟件包&#xff0c;是ROS應用程序代碼的組織單元&#xff0c;每個軟件包都可以包含程序庫、可執…

接軟件開發項目,你需要知道這些!

作為一個程序員&#xff0c;跟客戶交流是最困難的事情了&#xff0c;所以在上路之前&#xff0c;復習一下這兩年遇到的奇怪的客戶言論&#xff0c;以便以后更好地跟客戶交流。1、不就是做個網站&#xff08;或者別的&#xff09;么&#xff1f;為什么這么貴&#xff1f;一定耐心…

整理的一些比較基礎的面試知識點

1、面向對象的三大特性或其具體體現在哪 2、頁面間傳值方式 3、session cookie原理及區別 4、hasstable&#xff0c;dictionary&#xff0c;List &#xff0c;collection 5、類和抽象類&#xff0c;類和接口&#xff0c;接口和抽象類區別及適合場景 6、Get和Post比較優缺點或區…

五種類型的程序員,你屬于哪一種?

在我的編程生涯中,我碰到過很多奇奇怪怪的對手和同盟。我把這些編碼戰士們分成五類&#xff0c;有些人是你隊伍中的好伙伴&#xff0c;有些人則是搗蛋者&#xff0c;讓你的每一個計劃都完不成。不管怎么說&#xff0c;他們在軟件開發的諸神殿上都占有一席之地。如果你的團隊中沒…

創建ROS程序包

一個catkin程序包由什么組成? 一個程序包要想稱為catkin程序包必須符合以下要求&#xff1a; 該程序包必須包含catkin compliant package.xml文件這個package.xml文件提供有關程序包的元信息。 程序包必須包含一個catkin 版本的CMakeLists.txt文件&#xff0c;而Catkin meta…

一些有用的js插件

getfuelux.com 一系列插件合集 Ion.RangeSlider 超級牛的范圍選擇控件 Ion.CheckRadio Ion.Tabs Ion.Calendar Ion.ImageSlider Ion.Zoom www.ngwidgets.com Advanced UI Widgets for AngularJS http://www.jq22.com/ jQuery 插件庫 http://jvectormap.com/ 地圖插件 X-…

C# FTP操作類庫

class FTP_Class{string ftpServerIP;string ftpUserID;string ftpPassword;FtpWebRequest reqFTP; #region 連接/// <summary>/// 連接FtpWebRequest/// </summary>/// <param name"path"></param>private void Connect(String path)/…

安裝并配置ROS環境

參考該網址內容&#xff1a;http://wiki.ros.org/cn/ROS/Tutorials/InstallingandConfiguringROSEnvironment

Cropper – 簡單的 jQuery 圖片裁剪插件

Cropper 是一個簡單的 jQuery 圖像裁剪插件。它支持選項&#xff0c;方法&#xff0c;事件&#xff0c;觸摸&#xff08;移動&#xff09;&#xff0c;縮放&#xff0c;旋轉。輸出的裁剪數據基于原始圖像大小&#xff0c;這樣你就可以用它們來直接裁剪圖像。 如果你嘗試裁剪跨域…

C# JSON格式數據用法

JSON簡介JSON(全稱為JavaScript ObjectNotation) 是一種輕量級的數據交換格式。它是基于JavaScript語法標準的一個子集。JSON采用完全獨立于語言的文本格式&#xff0c;可以很容易在各種網絡、平臺和程序之間傳輸。JSON的語法很簡單&#xff0c;易于人閱讀和編寫&#xff0c;同…