java中什么叫做泛型_java中什么是泛型

一. 泛型概念的提出(為什么需要泛型)?

首先,我們看下下面這段簡短的代碼:

9c49bbeafd05eb8f4c9ebe2d811877dd.gif1 public class GenericTest {

2

3 public static void main(String[] args) {

4 List list = new ArrayList();

5 list.add("qqyumidi");

6 list.add("corn");

7 list.add(100);

8

9 for (int i = 0; i < list.size(); i++) {

10 String name = (String) list.get(i); // 1

11 System.out.println("name:" + name);

12 }

13 }

14 }9c49bbeafd05eb8f4c9ebe2d811877dd.gif

定義了一個List類型的集合,先向其中加入了兩個字符串類型的值,隨后加入一個Integer類型的值。這是完全允許的,因為此時list默認的類型為Object類型。在之后的循環中,由於忘記了之前在list中也加入了Integer類型的值或其他編碼原因,很容易出現類似於//1中的錯誤。因為編譯階段正常,而運行時會出現“java.lang.ClassCastException”異常。因此,導致此類錯誤編碼過程中不易發現。

在如上的編碼過程中,我們發現主要存在兩個問題:

1.當我們將一個對象放入集合中,集合不會記住此對象的類型,當再次從集合中取出此對象時,改對象的編譯類型變成了Object類型,但其運行時類型任然為其本身類型。

2.因此,//1處取出集合元素時需要人為的強制類型轉化到具體的目標類型,且很容易出現“java.lang.ClassCastException”異常。

那么有沒有什么辦法可以使集合能夠記住集合內元素各類型,且能夠達到只要編譯時不出現問題,運行時就不會出現“java.lang.ClassCastException”異常呢?答案就是使用泛型。

二.什么是泛型?

泛型,即“參數化類型”。一提到參數,最熟悉的就是定義方法時有形參,然后調用此方法時傳遞實參。那么參數化類型怎么理解呢?顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變量參數,此時類型也定義成參數形式(可以稱之為類型形參),然后在使用/調用時傳入具體的類型(類型實參)。

看着好像有點復雜,首先我們看下上面那個例子采用泛型的寫法。

9c49bbeafd05eb8f4c9ebe2d811877dd.gif1 public class GenericTest {

2

3 public static void main(String[] args) {

4 /*

5 List list = new ArrayList();

6 list.add("qqyumidi");

7 list.add("corn");

8 list.add(100);

9 */

10

11 List list = new ArrayList();

12 list.add("qqyumidi");

13 list.add("corn");

14 //list.add(100); // 1 提示編譯錯誤

15

16 for (int i = 0; i < list.size(); i++) {

17 String name = list.get(i); // 2

18 System.out.println("name:" + name);

19 }

20 }

21 }9c49bbeafd05eb8f4c9ebe2d811877dd.gif

采用泛型寫法后,在//1處想加入一個Integer類型的對象時會出現編譯錯誤,通過List,直接限定了list集合中只能含有String類型的元素,從而在//2處無須進行強制類型轉換,因為此時,集合能夠記住元素的類型信息,編譯器已經能夠確認它是String類型了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值