泛型的深入理解和案例解析(1) 應用篇

2021-10-23 02:01:37 字數 2078 閱讀 5267

3. 注意點

凡事一件事情的發生,必然有其合理性。

泛型是jdk 1.5 加入的一種語言特性,它主要是為了解決在集合類元素預設object型別,新增元素沒有型別限制,導致執行時出現異常的問題。

在我看來泛型主要解決兩個問題:

編譯期的型別檢查。比如list指定型別,新增元素。

動態化的引數型別繫結。比如泛型類的成員變數型別,真正到實現的時候或者new的時候才指定,這樣增加了**的通用性,這和多型有異曲同工之妙。

泛型,也叫作「形式型別引數」,是用於界定引數型別的一種方式。

這樣說可能不大好理解,對比來看,如下**方法

private

void

sample

(int x, string y)

sample(1

,"str");

//實際引數

x和y 叫做形參,即「形式引數」,是對引數的一種形式化。

1和「str」 叫做實參,即「實際引數」, 是真正傳入的引數實體。

那麼泛型,也叫做「形式型別引數」,顧名思義就是對「引數型別」的一種形式化表示。你可以像傳遞實參一樣,傳遞實際型別過來,這也就增加了**的通用性。

因為泛型是對引數型別的一種形式化表示,所以凡是用到引數型別定義的地方(或者說凡是有變數定義的地方),都可以有泛型存在。

泛型的使用,主要注意語法,其他的使用和引數型別沒有什麼區別。

一般介面定義中,成員變數和成員方法都是有特定預設修飾的。泛型是對其中所用引數型別的限制,這裡需要注意到泛型的使用格式。

public

inte***ce

igeneric

對於介面,有兩種方式實現,因此也就有兩種方式來使用泛型。

不指明泛型的實現

public

class

genericimpl

implements

igeneric

@override

public

void

setparam

(t param)

}

指明泛型的實現

class

genericstring

implements

igeneric

@override

public

void

setparam

(string param)

}

泛型介面中的第一種實現,其實就是泛型類。將implements 去掉,就是標準的泛型類了。

public

class

genclass

public t getdata()

}

使用例項如下:

genclass

genstringclass =

newgenclass

("china");

system.err.

println

(genstringclass.

getdata()

);

輸出:

china

泛型方法兩種形式,定義如下:

有返回值

private

t trans

(genericimpl

impl)

無返回值

private

void

set(genericimpl

impl)

對於靜態的方法而言,由於靜態方法不依賴與類物件的建立,所以靜態方法不能依賴類是泛型類,因此靜態方法使用泛型,必須定義為泛型方法。泛型的型別引數只能是類型別,不能是簡單型別。

泛型的深入理解和案例解析(2) 上下界和萬用字元

在上一小節 泛型的深入理解和案例解析 1 應用篇 我們知道了泛型的基本使用,並且也注意到泛型僅支援類型別,而不支援基本型別。那麼問題出來了,類型別之間有繼承關係,泛型是不是支援呢,本節就將對這個問題進行深入分析。問題1 比如乙個arraylist列表,要往裡邊放入數字,但是不確定integer lo...

深入理解泛型(一)

一 型別推斷 在我們寫泛型 的時候經常有大量的 符號,這樣有時候 一多,也難免會讓開發者在閱讀 過程中會覺得有點暈的,此時我們覺得暈的時候肯定就會這樣想 是不是能夠省掉一些 符號的呢?你有這種需求了,當然微軟這位好人肯定也會幫你解決問題的,這樣就有了我們這部分的內容 型別推斷 意味著編譯器會在呼叫乙...

C 泛型深入理解介紹

引言 在上乙個專題中介紹了c 2.0 中引入泛型的原因以及有了泛型後所帶來的好處,然而上一專題相當於是介紹了泛型的一些基本知識的,對於泛型的效能為什麼會比非泛型的效能高卻沒有給出理由,所以在這個專題就中將會介紹原因和一些關於泛型的其他知識。一 泛型型別和型別引數 泛型型別和其他int,string一...