談談我對Java中泛型的理解
阿新 • • 發佈:2019-01-28
eg1:
Map map = new HashMap();
map.put("key" , "xuqiang");
String s = (String) map.get("key");
大家都知道,存放在java容器裡(Java容器類包含List、ArrayList、Vector及map、HashTable、HashMap、Hashset)的是Object物件,當我們從容器取出時,需要強制轉換。
在eg1當中,當我們取出map的值時就將值強制轉換成了String型別。
由於Java語言裡面所有的型別都繼承於java.lang.Object,那Object轉型為任何物件成都是有可能的。如果你是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");
泛型是不是很不錯啊?