Java 容器 & 泛型:6、容器講到爲何要使用泛型

Writer:BYSocket(泥沙磚瓦漿木匠)java

微博:BYSocketweb

豆瓣:BYSocket算法

    ArrayList是集合類中無處不在的,泛型也是,泛型對集合類尤爲有用。可是爲啥要使用泛型?理解好了這個問題能夠幫助理解相關的更多知識點。下面泥瓦匠以最簡單的例子來驗證這個問題。安全

1、泛型

    泛型的目的是爲了可讓更多不一樣類型的對象重用。沒錯,這樣理解就太low。真正目的是爲了在編譯時找到bug,而不是在運行時。(編譯時,指的是源代碼翻譯成機器識別的代碼的時候。運行時,是指代碼在機器中運行的時候。)泛型只存在編譯時,理解這個能夠幫助你更好的理解泛型。socket

    這樣,在編譯時會比在運行時更容易地找到bug和修復。this


2、實現沒有泛型的簡易版ArrayList

    簡易版的ArrList有個Obejct對象(由於是Object,咱們能夠add任意類型。)好比說,Integer 和 String的。代碼以下:spa

/**
 * 簡易版ArrayList
 */
class ArrList
{
    private Object obj;
 
    public Object getObj()
    {
        return obj;
    }
 
    public void add(Object obj)
    {
        this.obj = obj;
    }
     
}
 
public class TestArrayList
{
    public static void main(String[] args)
    {
        ArrList arrList = new ArrList();
        arrList.add(1);
        arrList.add("1");
         
        Integer objInt = (Integer) arrList.getObj();
        System.out.println(objInt);
    }
}

 

運行能夠看出會出現ClassCastException:翻譯

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
    at javaBasic.generic.TestArrayList.main(TestArrayList.java:30)

想問的問題是:」這Object對象屬性,怎麼不能強轉呢?「code

:編譯時,代碼沒錯的。運行main時,當set了String類型時,將結果強制轉換爲Integer就會報錯這個錯了。orm

泥瓦匠的記憶宮殿又來了:

一、使用泛型比那些雜亂的須要強制轉換的Object代碼具備更好的安全性和可讀性。

二、使用泛型能夠在編譯時輕鬆找到和解決bugs

3、使用改寫簡易版ArrayList

    使用泛型代碼以下:

package javaBasic.generic;
 
/**
 * 簡易版ArrayList
 */
class ArrList<T>
{
    private T obj;
 
    public T getObj()
    {
        return obj;
    }
 
    public void add(T obj)
    {
        this.obj = obj;
    }
     
}
 
public class TestArrayList
{
    public static void main(String[] args)
    {
        ArrList<Integer> arrList = new ArrList<>();
        arrList.add(1);
//      arrList.add("1");
         
        Integer objInt = arrList.getObj();
        System.out.println(objInt);
    }
}

 

這時候若是想用

arrList.add("1");

 

會發現:

image

這時候就是泛型大顯身手的時候,也不用須要對屬性 get 方法時的強制轉換。其實,  Java 泛型只是編譯時的概念,由於編譯後類型會被擦除,還本來真。這裏T就至關於Integer。

4、小結

泥瓦匠記憶宮殿

一、在編譯時檢查強類型

二、顯示轉換的消除(上面的Integer get省去)

三、更好地實現代碼重用和泛型算法

四、使用泛型比那些雜亂的須要強制轉換的Object代碼具備更好的安全性和可讀性。

   Java 泛型只是編譯時的概念,由於編譯後類型會被擦除,還本來真。哈哈~下次說這個。

Writer:BYSocket(泥沙磚瓦漿木匠)

微博:BYSocket

豆瓣:BYSocket

相關文章
相關標籤/搜索