1. 程式人生 > >談談我對Java中泛型的理解

談談我對Java中泛型的理解

eg1:
Map map = new HashMap();
map.put("key" , "xuqiang");
String s = (String) map.get("key");
大家都知道,存放在java容器裡(Java容器類包含ListArrayListVectormapHashTableHashMap、Hashset的是Object物件,當我們從容器取出時,需要強制轉換。 eg1當中,當我們取出map的值時就將值強制轉換成了String型別。 由於Java語言裡面所有的型別都繼承於java.lang.Object,那Object轉型為任何物件成都是有可能的。
但是也因為有無限的可能性,就只有程式設計師和執行期的虛擬機器才知道這個Object到底是個什麼型別的物件。. 在編譯期間,編譯器無法檢查這個Object的強制轉型是否成功,如果僅僅依賴程式設計師去保障這項操作的正確性,許多ClassCastException的風險就會被轉嫁到程式執行期之中。
如果你是oracle的工程師,自然而然會想,能不能限定放入容器的型別呢?這時候泛型就應運而生了。泛型的核心思想就是由程式設計師指定型別,這樣集合就只能容納該型別的元素。
eg2:           
Map<String, String> mapNew = new HashMap<String, String>();
mapNew.put( "keyNew", "xuqiangNew");
String sNew = mapNew.get("keyNew");

在eg2中,限定了放入的型別是String,當然取出來的時候也不用強轉了。
在JDK1.5之後,java引入了泛型的概念,它的本質是引數化型別(Parameterized Type)的應用,也就是說所操作的資料型別被指定為一個引數,在用到的時候在指定具體的型別。 這種引數型別可以用在類、介面和方法的建立中,分別稱為泛型類、泛型介面和泛型方法。
Java 語言中引入泛型是一個較大的功能增強。不僅語言、型別系統和編譯器有了較大的變化,以支援泛型,而且類庫也進行了大翻修,所以許多重要的類,比如集合框架,都已經成為泛型化的了。oracle工程師贊不讚?
泛型帶來了很多好處:
1、型別安全。 泛型的主要目標是提高 Java 程式的型別安全。通過知道使用泛型定義的變數的型別限制,編譯器可以在一個高得多的程度上驗證型別假設。沒有泛型,這些假設就只存在於程式設計師的頭腦中(或者如果幸運的話,還存在於程式碼註釋中)。

2、Java 程式中的一種流行技術是定義這樣的集合,即它的元素或鍵是公共型別的,比如“String 列表”或者“String 到 String 的對映”。通過在變數宣告中捕獲這一附加的型別資訊,泛型允許編譯器實施這些附加的型別約束。型別錯誤現在就可以在編譯時被捕獲了,而不是在執行時當作 ClassCastException 展示出來。將型別檢查從執行時挪到編譯時有助於您更容易找到錯誤,並可提高程式的可靠性。
3、消除強制型別轉換。 泛型的一個附帶好處是,消除原始碼中的許多強制型別轉換。這使得程式碼更加可讀,並且減少了出錯機會。
繼續研究eg2,開啟Map原始碼,可以看到map定義了<K,V>泛型,這樣子我們就能很隨意的設定了放入map中的型別了。
Map<String, Integer>
Map<String, Float>
Map<Float, String>
……

在實際使用時,我們也可以定義自己想定義的泛型。 使用舉例:
eg3:
實體類:
public class Person<A> {
     
     private A a;
     
     void setAge(A a){
            this. a = a;
     }

}
使用:
//塞入Integer型別
Person<Integer> person = new Person<Integer>();
person.setAge(24);
//塞入String型別           
Person<String> person2 = new Person<>();
person2.setAge( "24");

泛型是不是很不錯啊?