泛型簡析 一 泛型是什麼?

2021-09-25 06:29:03 字數 2071 閱讀 2535

泛型,即」不確定的引數型別」,使**可應用於多種不同的型別,而不再是僅限於一種確定的型別。泛型使我們可以通過引數確定類要使用的型別。

泛型類泛型類的定義需要將型別引數列表放在類名的後面

class

classname

..>

例:

public

class

test

public

void

sett

(t t)

public

static

void

main

(string[

] args)

}classa}

//執行結果:

//this is class a.

在建立test例項的時候,我傳進去乙個型別引數a ,這樣test就知道我需要用這個類是什麼型別,並且我不需要對取出的t進行強轉,它依舊可以執行這個類自己的方法,因為它返回的就是乙個a的例項,而不是object。

泛型方法

泛型方法需要將型別引數列表放在返回值的前面,使用時可以用在返回值上,也可以用在方法引數中

returntype methodname()

例:

public

class

test

public

static

void

main

(string[

] args)

}classa}

//執行結果

//this is class b.

這樣,我們就可以通過泛型來指定應用需要使用的型別,而不需要使用具體的型別。

在宣告變數及定義方法時可以使用泛型萬用字元「?」,表示任意泛型型別,但是取出時要小心,正因為能表示任意泛型型別,它不能確定它取出來的是否和你所需要的那種,所以它只能以object的方式取出來。

如圖所示,程式無法找到view這個方法,因為它不確定取出來的這個值是什麼型別,所以不能判斷是否擁有這個方法。

使用泛型萬用字元範圍過大,或許我們並不需要這麼大的範圍,僅僅需要限定泛型的一小範圍,那麼我們可以使用extends/super來進行限制

public

class

test

}public

static

void

main

(string[

] args)

}class

aclass

bextends

a//執行結果:

//蠢豬鏡

//蠢豬鏡

可以看到,不僅是list0可以傳遞進去,list1也可以,因為限制了泛型的上界,只要是持有型別a及其子類的list都可以作為引數傳遞進去,這就是所謂的上界。

public

class

test

}public

static

void

main

(string[

] args)

}classa}

class

bextendsa}

class

cextends

b

在遍歷list中元素時,我嘗試使用b或者a去作為增強for的需要遍歷的型別,但是卻報錯了。後來我想清楚了,因為使用的這些類在其上還有父類,而子類中可能擁有一些父類沒有的值或方法,這樣就不能直接用這種還有父類的類去作為遍歷的型別,需要使用object類。

泛型的出現給開發帶來了許多的便利,讓我們可以在一段**中使用不同的型別,而不用去針對乙個型別去寫大量相同的**。並且使用泛型也使**更加簡潔易讀。但是在泛型中,還有其他的東西需要去學習,如汎型的型別擦除,型別擦除是泛型實現過程中乙個重要的機制,下乙個部落格將會對型別擦除作出詳細的講解。

泛型是什麼

類似c 的模板template c 的泛型是在例項的方法被呼叫時檢查過載是否產生混淆,而不是在泛型類本身編譯時檢查。同時還得出乙個重要原則 當一般方法與泛型方法具有相同的簽名時,會覆蓋泛型方法。泛型中的靜態成員變數 在c 1.x中,我們知道類的靜態成員變數在不同的類例項間是共享的,並且他是通過類名訪...

泛型是什麼?

泛型用乙個通用的資料型別t來代替object,在類例項化時指定t的型別,執行時 runtime 自動編譯為本地 執行效率和 質量都有很大提高,並且保證資料型別安全。如果不使用泛型,可能出現的問題 如果傳的int型別引數,要寫乙個方法。如果傳string型別引數,還要寫乙個方法。public clas...

泛型 什麼是泛型

泛型 即通過引數化型別來實現在同乙份 上操作多種資料型別。泛型程式設計是一種程式設計正規化,它利用 引數化型別 將型別抽象化,從而實現更為靈活的復用。c 泛型的作用概述 c 泛型賦予了 更強的型別安全,更好的復用,更高的效率,更清晰的約束。在乙個方法中,乙個變數的值是可以作為引數,但其實這個變數的型...