為什麼需要泛型:編寫程式的時候容易遇到兩個模組功能相近但是引數型別不同,所以分別寫多個方法處理每種資料型別,不能重用同樣功能的**。
用根類object來解決存在的缺陷:
a:會出現裝箱和拆箱的操作,將會在託管堆上分配和**大量的變數,如果數量龐大,效能會損失嚴重。
b:雖然處理引用型別,沒有裝箱和拆箱的操作,但講用到的資料型別強制轉換的時候會增加處理器的負擔
泛型:可以將型別作為引數來傳遞,建立型別的時候用乙個特定的符號「t」來作為佔位符。允許延遲編寫類或者方法中資料型別的規範,也就是等到例項化時候再用乙個實際的型別來替代。
好處:a:解決了多個模組功能相近但是引數型別不同的問題。提高了重用性。
b:相對於用object解決上述問題,泛型不用裝箱拆箱,降低成本。
c: 可以堆泛型引數進行限定以訪問特定資料型別,利用泛型約束。
namespace blog1
static
void
main
(string
args)}}
/*輸出:
a:11 b:10
*/
泛型約束:對能都例項化類的型別種類施加限制。
好處:不讓做一些約束型別不能做的,比如說約束了只能是值型別,方法裡面卻用約束的泛型做值型別不能做的,就會報錯。
常用的約束型別: 約束
作用where t : struct
泛型t是值型別(小數、整數、char、bool、struct)
where t : class
泛型t是引用型別
where t : new()
泛型t具有乙個無引數的構造方法,如果有多個約束,new()要放在最後。不能和struct一起用。
where t : 基類名
泛型t是該基類或者其派生類
where t : 介面名
泛型t是實現了該介面的型別
public
void
test
<
t>
(ref
t a,
reft b)
where t:
struct
約束多個泛型
public
void
test
u>
(ref
t a,
refu b)
where u:
struct
where t:
class
,new()
namespace blog1
public
class
maserati
:car
}//泛型類+約束
public
class
carshop
where t : car
public
void
buy(
t car)
}class
program}}
/*輸出:
進購瑪莎拉蒂
*/
inte***ce
italk
public
class
chinese
: italk
}
自定義泛型委託
namespace blog1
static
void
main
(string
args)}}
/*輸出:
test1 num=1
*/
內建的泛型委託:不用顯示宣告自定義的委託。
func委託:內建的有返回值的泛型委託,可以接受0個至16個傳入引數。
namespace blog1
static
void
main
(string
args)}}
/*輸出:
102*/
action委託:內建的無返回值的泛型委託,可以接受0個至16個傳入引數。
namespace blog1
static
void
main
(string
args)}}
/*輸出:
102*/
Java 泛型知識點
1 在你建立引數化型別的乙個例項時,編譯器會為你負責轉型操作,並且保證型別的正確性。泛型的主要目的之一就是用來指定容器要持有什麼型別的物件,而且由編譯器來保證型別的正確性。示例 public class holder class orange extends fruit fruit 1 new jo...
泛型知識點整理
泛型好處 1 將執行時期的問題classcastexception轉到了編譯時期 2 避免了強制轉換的麻煩 什麼時候用 當操作的引用資料型別不確定的時候,使用 泛型擦除 執行時,會將泛型去掉,生產的class檔案中是不帶泛型的,這個稱為泛型的擦除。泛型補償 執行時,通過獲取元素的型別進行轉換動作,不...
黑馬程式設計師 泛型知識點 總結
asp.net android ios開發 net培訓 期待與您交流!1.泛型,為了適應通用程式設計,我們可以使用型別引數,利用特定的型別,定義我們需要的類。泛型就是乙個抽象層,是型別的模板,用它定義具體的型別,才能例項化對外.2.c 提供5種泛型 類 結構 介面 委託和方法。注意前面4個是型別,而...