泛型出現(xiàn)的動(dòng)機(jī)在于:
有許多原因促成了泛型的出現(xiàn),而最引人注意的一個(gè)原因,就是為了創(chuàng)建容器類。
泛型類
容器類應(yīng)該算得上最具重用性的類庫之一。先來看一個(gè)沒有泛型的情況下的容器類如何定義:
public class Container{private String key;private String value;public Container(String k,String v){
Container類保存了一對(duì)key-value鍵值對(duì),但是類型是定死的,也就說如果我想要?jiǎng)?chuàng)建一個(gè)鍵值對(duì)是String-Integer類型的,當(dāng)前這個(gè)Container是做不到的,必須再自定義。那么這明顯重用性就非常低。
當(dāng)然,我可以用Object來代替String,并且在Java SE5之前,我們也只能這么做,由于Object是所有類型的基類,所以可以直接轉(zhuǎn)型。但是這樣靈活性還是不夠,因?yàn)檫€是指定類型了,只不過這次指定的類型層級(jí)更高而已,有沒有可能不指定類型?有沒有可能在運(yùn)行時(shí)才知道具體的類型是什么?
所以,就出現(xiàn)了泛型。
public class Container<K,V>{private K key;private V value;public Container(K k,V v){
在編譯期,是無法知道K和V具體是什么類型,只有在運(yùn)行時(shí)才會(huì)真正根據(jù)類型來構(gòu)造和分配內(nèi)存。如果你想學(xué)習(xí)Java可以來這個(gè)群,首先是五三二,中間是二五九,最后是九五二,里面有大量的學(xué)習(xí)資料可以下載??梢钥匆幌卢F(xiàn)在Container類對(duì)于不同類型的支持情況:
public class Main{public static void main(String[]args){輸出:name:findingsea
泛型接口
在泛型接口中,生成器是一個(gè)很好的理解,看如下的生成器接口定義:
public interface Generator<T>{public T next();
然后定義一個(gè)生成器類來實(shí)現(xiàn)這個(gè)接口:
public class FruitGenerator implements Generator<String>{
調(diào)用:
public class Main{public static void main(String[]args){
輸出:
Banana
泛型方法
一個(gè)基本的原則是:無論何時(shí),只要你能做到,你就應(yīng)該盡量使用泛型方法。也就是說,如果使用泛型方法可以取代將整個(gè)類泛化,那么應(yīng)該有限采用泛型方法。下面來看一個(gè)簡(jiǎn)單的泛型方法的定義:
public class Main{public static<T>void out(T t){
可以看到方法的參數(shù)徹底泛化了,這個(gè)過程涉及到編譯器的類型推導(dǎo)和自動(dòng)打包,也就說原來需要我們自己對(duì)類型進(jìn)行的判斷和處理,現(xiàn)在編譯器幫我們做了。這樣在定義方法的時(shí)候不必考慮以后到底需要處理哪些類型的參數(shù),大大增加了編程的靈活性。
再看一個(gè)泛型方法和可變參數(shù)的例子:
public class Main{public static<T>void out(T...args){for(T t:args){
輸出和前一段代碼相同,可以看到泛型可以和可變參數(shù)非常完美的結(jié)合。
Java相關(guān)技術(shù)內(nèi)容
Java泛型詳解:http://www.bjpowernode.com/tutorial_java_advance/645.html
以上就是深圳達(dá)內(nèi)教育java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java方法泛型之泛型類、泛型接口和泛型方法”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。