Java基礎:泛型
同樣是面試當中遇到的問題,在平常寫代碼的過程當中,經常有使用到泛型編程,比如用到的各種集合方式,如Arraylist、hashmap、List、等,都有使用到泛型。但是當面試官讓自己系統的介紹一下泛型編程的時候,自己也突然懵逼了,自己所理解的所謂泛型,就是在聲明容器變量的時候,將類型當做參數聲明進來,對於泛型的其他特性和好處,自己都沒有很系統的了解,特此在此系統的總結一下,java當哈總很重要的一個部分,就是泛型編程。
在java沒有增加泛型類之前,泛型程序的設計是通過繼承來實現的,即比如Arraylist來說,其只維護了一個Object引用的數組,當存入其他類型的時候,則通過強值類型轉化進行,這樣會出現問題,且先看下面的代碼:
public class Test { public static void main(String[] args) { List list = new ArrayList(); list.add("qqyumidi"); list.add("corn"); list.add(100); for (int i = 0; i < list.size(); i++) { String name = (String) list.get(i); // 1 System.out.println("name:" + name); } } }
在代碼當中,list變量由於維護的是一個object的數據,而object類型是所有類型的父類,所有可以往該list存入任何類型的實例,在代碼中就存入了兩個String類型和一個Integer類型的實例,而這樣就會導致在讀取數組當中的變量的時候,無法提前預知數據當中存入的究竟是什麽類型的變量,導致出現強制類型轉換異常,比如在例子當中,就會出現讀取到第三個Integer型變量的時候,報錯。這就是沒有泛型類之前,java所面臨的問題,只有在程序員自己的腦子裏預先定好哪一個類是存儲什麽類型的變量的容器,而不能體現在代碼當中,導致代碼的安全性和可讀性不高。
為了解決這個問題,java提出了泛型類的概念,泛型,即“參數化類型”。
public class test { public static void main(String[] args) { /* List list = new ArrayList(); list.add("qqyumidi"); list.add("corn"); list.add(100); */ List<String> list = new ArrayList<String>(); list.add("qqyumidi"); list.add("corn"); //list.add(100); // 1 提示編譯錯誤 for (int i = 0; i < list.size(); i++) { String name = list.get(i); // 2 System.out.println("name:" + name); } } }
在這個例子當中List在聲明的時候,將String當做參數聲明進了list變量當中,那麽該list就是一個被聲明只能存String類型的list了,而這時候還想要往list插入Integer型,則編譯器就會檢查報錯。這樣無疑是增加了代碼的可讀性和安全性。這是從泛型類的一個方面上來看泛型的好處。
那麽從泛型類的使用者的角度來看泛型好處,那麽就是一個容器類,使用泛型之後,可以增加代碼的重用性,而不需要為每一種變量去編寫特定的容器類,比如String類型,去編寫一個只能存儲String類型的容器,而Integer類型,又只能再去編寫一個只能存儲Integer類型的容器類,在使用泛型的過程中,我們只需要用<>的形式,將要存儲的類型參數化的傳入就可以只需要編寫一個容器類的代碼,而可以將這個容器類用於轉載各種類型的實例,這就是從另一方面來看泛型的好處。下面簡單的上一個自定義泛型編程的代碼:
class Box<T> { private T data; public Box() { } public Box(T data) { setData(data); } public T getData() { return data; } public void setData(T data) { this.data = data; } }
Java基礎:泛型