1. 程式人生 > >黑馬程式設計師——(八)泛型

黑馬程式設計師——(八)泛型

[java] view plaincopyprint?
  1. ArrayList al1 = new ArrayList ();  
  2. al1.add("abc");  
  3. al1.add("789");  
  4. al1.add("ddd");  
  5. al1.add(3);  
  6. ListIterator it = al1.listIterator();  
  7.     while (it.hasNext()) {  
  8.         String str = (String)it.next();  
  9.         System.out.println(str);  
  10.     }  
ArrayList al1 = new ArrayList ();
al1.add("abc");
al1.add("789");
al1.add("ddd");
al1.add(3);

ListIterator it = al1.listIterator();
	while (it.hasNext()) {
			
		String str = (String)it.next();
		System.out.println(str);
	}

這種寫法就會造成類轉換異常,為了解決這樣的問題,在JDK1.5中引入了一種機制——泛型機制。這種機制的好處是,把只能在執行時才能觀察到的錯誤提前到編譯時就能發現,及時解決。

例如,將以上程式碼中例項化ArrayList時,變成如下格式

ArrayList<String> al1 = new ArrayList<String>();

就會在編譯時,對al1.add(3)進行檢查,然後報錯,當然,迭代器也可以使用泛型機制:ListIterator<String> it = al1.listIterator();這樣就避免了在迴圈中取出元素再進行強制型別轉換了。

以上程式碼用泛型機制寫就是如下形式:

[java] view plaincopyprint?
  1. ArrayList<String> al1 = new ArrayList<String>();  
  2. al1.add("abc");  
  3. al1.add("789");  
  4. al1.add("ddd");  
  5. ListIterator<String> it = al1.listIterator();  
  6.     while (it.hasNext()) {  
  7.         String str = it.next();  
  8.         System.out.println(str);  
  9.     }  
ArrayList<String> al1 = new ArrayList<String>();
al1.add("abc");
al1.add("789");
al1.add("ddd");

ListIterator<String> it = al1.listIterator();
	while (it.hasNext()) {
			
		String str = it.next();
		System.out.println(str);
	}

在宣告一個類時候使用泛型

自定義一個類,若要用到泛型,可以用如下形式:

[java] view plaincopyprint?
  1. class Student<T> {  
  2.     T t;  
  3. }  
class Student<T> {
	T t;
	
}

在自定義的類中,實現帶有泛型的方法:

[java] view plaincopyprint?
  1. class Student {  
  2.     public <T> void show(T t) {  
  3.     }  
  4. }  
class Student {
	public <T> void show(T t) {
	}
}

或者

[java] view plaincopyprint?
  1. class Student <T> {  
  2.     publicvoid show(T t) {  
  3.     }  
  4. }  
class Student <T> {
	public void show(T t) {
	}
}

但是用如此形式定義的泛型,是不支援靜態方法的。因為靜態方法是隨著類的載入而進入方法區的,而泛型具體是什麼型別是在例項化物件時才明確的,也就是說,泛型代表的型別明確晚於靜態方法載入,這樣會使其要操作的物件型別不明確,如果必須在靜態方法上使用泛型,可以用如下形式:

[java] view plaincopyprint?
  1. publicstatic <T> void show(T t) {  
  2. }  
  3. 介面上使用泛型:  
  4. interface Inte <T> {  
  5. void show (T t);  
  6. }  
  7. 然後用類來實現這個介面,  
  8. class InteClass implements Inte<String> {  
  9. void show (){  
  10. }  
  11. }  
  12. 如果在定義類的時候,仍然不明確資料型別,就可以採用如下方式,  
  13. class InteClass <T> implements Inte<T> {  
  14. void show (T t) {  
  15. }  
  16. }  
public static <T> void show(T t) {
}
介面上使用泛型:
interface Inte <T> {
void show (T t);
}
然後用類來實現這個介面,
class InteClass implements Inte<String> {
void show (){
}
}
如果在定義類的時候,仍然不明確資料型別,就可以採用如下方式,
class InteClass <T> implements Inte<T> {
void show (T t) {
}
}

泛型的擴充套件:

泛型的擴充套件主要有兩種表現形式,<? extends E><? super E>,這兩種方式都是用來指定泛型可表示類的範圍,前者是用來指定上限的,該類及其子類適用;後者是用來指定下限的,該類及其父類適用。

相關推薦

黑馬程式設計師——

[java] view plaincopyprint? ArrayList al1 = new ArrayList ();  al1.add("abc");  al1.add("789");  al1.add("ddd");  al1.add(3);  ListIterator it = al1.l

java 核心技術卷I學習記錄- 程式設計

java 核心技術卷第八章:泛型程式設計 ##1. 為什麼要使用泛型程式設計 泛型程式設計(Generic programming) 意味著編寫的程式碼可以被很多不同型別的物件所重用。 2. 定義簡單泛型類 public class Pair<T>

《瘋狂Java講義》學習筆記

1、概述 增加泛型其中一個重要原因是為了讓集合能記住其元素的資料型別,防止從集合取出物件時,強轉型別容易引起ClassCastExeception異常 泛型將執行時異常轉移至編譯時異常: List list = new ArrayList(); li

C#基礎知識

泛型的好處很多,包括複用性(可供多個型別使用而不用每個型別都定義一次),型別安全(不合法的型別報錯),高效率(減少裝箱和拆箱) 舉例: 假設我們有一個父類Animal,所有動物繼承這個類,現在需要做一個比較動物重量的方法,如果不用泛型,則我們隊沒類動物都需要過載一次比較的方

【從零開始搭建自己的.NET Core Api框架】倉儲的作用

tar write ges 分享圖片 () dex 抽象 .sql cut 系列目錄 一. 創建項目並集成swagger   1.1 創建   1.2 完善 二. 搭建項目整體架構 三. 集成輕量級ORM框架——SqlSugar   3.1 搭建環境   3.2 實戰篇:

java基礎3-----

1.概述(什麼是泛型?) 泛型,即“引數化型別”,顧名思義,將具體的型別引數化,在呼叫的時候再傳入具體的型別 2.一個簡單的例子 public class GenericTest { public static void main(String[] args) {

JAVA基礎複習和集合

1、泛型的優點是能在編譯時檢測出錯誤,一旦編譯器認為泛型型別是安全使用的,就會將它轉換為原始型別,泛型類或方法允許使用者指定可以和這些類或方法一起工作的物件型別 2、泛型型別必須是引用型別,不能使用int、double等基本型別來替代泛型集合 3、泛型集合類的構造方法和普通類相同,定義一個泛

ASM框架使用--與註解

泛型 對於泛型型別Type的解析,必須按照下面的順序 訪問方法簽名按照下面的順序 訪問類簽名的順序 其中大部分方法都會返回一個SignatureVisitor,用於訪問一個type簽名。 SignatureVisitor返回SignatureVisitors(不能返回null)。 A

被swoole坑哭的PHP程式設計師

本文主要記錄一下學習swoole的過程、填過的坑以及swoole究竟有多麼強大! 首先說一下對swoole的理解:披著PHP外衣的C程式。很多PHPer朋友看到swoole提供的強大功能、外界對其的崇拜便躍躍欲試的安裝、調 試其demo、編寫新功能,然後興奮的奔走相告。沒過幾天當你按

java核心技術8程式設計

泛型程式設計(Generic programming) 意味著編寫的程式碼可以被很多不同型別的物件所重用。 比雜亂的使用Object物件然後再進行強制型別轉換具有更好的可讀性和安全性。尤其對於集合。 public static <T extends Comparab

Kotlin自學之旅

文章目錄宣告泛型類型變型變的概念不變協變逆變小結宣告處型變使用處型變星投影總結 宣告泛型函式 泛型允許你定義帶型別形參的型別。當這種型別的例項被創建出來的時候,型別形參被替換成稱為型別實參的具體型別。Kotlin中泛型的使用與宣告和Java很相似,我們宣告一個泛

【 C# 資料結構】 -------------------------- 帶頭節點的單鏈表,雙向連結串列實現

在程式設計領域,資料結構與演算法向來都是提升程式設計能力的重點。而一般常見的資料結構是連結串列,棧,佇列,樹等。事實上C#也已經封裝好了這些資料結構,在標頭檔案 System.Collections.Generic 中,直接建立並呼叫其成員方法就行。不過我們學習當然要知其然,亦知其所以然。 本文實現的是連結

java反射9和Class類

在不適用泛型的時候,必須將利用反射得到的物件進行強制轉換才可以對他進行相應的賦值,如下 package Chapter_6; import java.util.Date; public class YeekuObjectFactory { public stat

設計模式之觀察者模式Observe-擴充套件

設計模式之觀察者模式(Observer) 擴充套件部分是很精彩 意圖 定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。 場景 觀測天氣(

[轉載]PM和程式設計師RD的相處之道--寫給那些血氣方剛的產品經理PM

最近有位剛做 PM(產品經理)的小夥跑來跟我控訴,說公司技術部的 RD 們(程式設計師)個個不給力。需求過了千百遍還是理解錯,或者就是簡單回一句“做不了”,表情如死灰。這位 PM 血氣方剛,張牙舞抓,腦子裡總有一千萬個新產品需求的想法撲騰著。他咄咄不停的抱怨 RD 們不配合,能力差,懶惰,沒思考能力,沒品位,

2017年上半年軟體工程師考試--程式設計師上午考點總結三

1、採用虛擬儲存器的目的是擴大使用者的地址空間 2、我國軟體著作權中的翻譯權是指將原版軟體由一種自然語言文字轉換成另一種自然語言文字 3、軟體著作權從軟體作品性的角度保護其表現形式,原始碼、目的碼、軟體文件是計算機軟體的基本表達方式,受著作權保護; 專利權從軟體功能性的角度

學會使用函數語言程式設計的程式設計師

前言:本文是轉載文,寫的很不錯,特意分享給大家,希望大家能學到更多有用的知識 在這篇由多部分組成的文章中,接下來將介紹函數語言程式設計的一些概念,這些概念對你學習函數語言程式設計有所幫助。如果你已經懂了什麼是函數語言程式設計,這可以加深你的理解。 請不要著急。從這一點開始,花點時間閱讀並理解

C++知識點程式設計與C++STL標準模板庫

1.泛型程式設計 把程式碼從特定的資料結構中分離出來,使得它不依賴於特定的資料結構而更加通用 容器->迭代器->演算法 介面卡 2.概念:用於界定具備一定功能的資料型別 comparable:可比較 Assignable:可賦值 Sortable:可比較且可賦值 3.模型:符合一個

高階程式設計師JAVA面試必知必會問題+答案

Java基本型別哪些,所佔位元組和範圍 型別 儲存要求 範圍(包含) 預設值 包裝類 整 int 4位元組(32位) -231~ 231-1 0 Integer 數 short 2位元組(16位) -215~215-1 0 Short 類 long 8位元組(64位) -263~263-1 0

spring學習筆記14——依賴注入

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!