国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

理解Java中的泛型(一)

YFan / 609人閱讀

摘要:參數(shù)化的類型其中是參數(shù)化的類型。類型參數(shù)的實(shí)例或?qū)嶋H類型參數(shù)其中是類型參數(shù)的實(shí)例或?qū)嶋H類型參數(shù)。它們并沒有重載,而且泛型中也不存在重載這一說法。除此之外,我們應(yīng)該盡量地多用泛型方法,而減少對整個類的泛化,因?yàn)榉盒头椒ǜ菀装咽虑檎f明白。

泛型是適用于許多許多的類型 ---《JAVA編程思想》

在Java的面向?qū)ο缶幊踢^程中, 或許你知道運(yùn)用繼承、接口等一系列面向?qū)ο蟮膭幼鱽韺?shí)現(xiàn)代碼復(fù)用,解耦等目的。 但是你知道的,原始類的繼承是單繼承,而接口更是把類型協(xié)議寫死了。我們的代碼能否不要這么死板(當(dāng)然你可以認(rèn)為那是完美的), 我們的代碼能否適用于更多的不具體的類型?代碼更加通用?甚至這個類型你自己都不知道?,沒錯,在JDK1.5中,JAVA引入了一個新的代碼泛化機(jī)制---泛型。

你必須事先知道的一些術(shù)語

原始類型

List users=new ArrayList();
其中List是原始類型。

參數(shù)化的類型

List users=new ArrayList<>();
其中List是參數(shù)化的類型。 即把原始類型參數(shù)化了。

泛型類型

List users=new ArrayList<>();  
其中List是泛型類型。 

類型變量或類型參數(shù)

List users=new ArrayList<>();
其中是類型變量或類型參數(shù)。 即一個指向某種類型的變量。 大家知道函數(shù)形成參,這里可以看做是"類型形參”。

類型參數(shù)的實(shí)例或?qū)嶋H類型參數(shù)

List users=new ArrayList<>();
其中是類型參數(shù)的實(shí)例或?qū)嶋H類型參數(shù)。  大家知道函數(shù)實(shí)參,這里可以看做是"類型實(shí)參”。

泛型也可以如此簡單

在JDK1.5版本以前,我們使用List集合get數(shù)據(jù)是需要轉(zhuǎn)型的,如下

List users=new ArrayList<>();

users.add("armstrong");

String user = (String) users.get(0);

上面代碼中,List集合是可以傳入任何Object及它的子類的。我們傳入一個String類型的數(shù)據(jù),取出來默認(rèn)是Object,所以你需要轉(zhuǎn)型。使用原始類型的弊端:在程序運(yùn)行起來的時候,可能會出現(xiàn)轉(zhuǎn)型失敗的異常。那么補(bǔ)救方法呢?

Jdk1.5里面是這樣定義List:

public interface List extends Collection {    
         
  int size();
       
  boolean isEmpty();
         
   T[] toArray(T[] a);
        
  boolean add(E e);

        ...
 }

你可以看到List類這個原始類型,定義成了接口List泛型類型。類、接口的泛型定義方式是一樣的,那么我們可以這樣編寫之前那段代碼:

List  usersGenertor=new ArrayList<>();

usersGenertor.add("armstrong");

String userS =   usersGenertor.get(0);

而且,此時List這個泛型類型集合里面只能添加String類型的對象,其他任何類型的不能添加。這樣就保證了我們在編寫代碼的時候(甚至是編譯期間)就能發(fā)現(xiàn)代碼可能會暴漏隱患的地方。下面代碼不能編譯:

 List  usersGenertor=new ArrayList<>();
 
 usersGenertor.add(new Object());// error,此處不能添加Object類型
 
 usersGenertor.add(123);// error,此處不能添加Integer類型
 
 String userS =   usersGenertor.get(0);

為了更好的解釋泛型的概念。打個比方,我們知道達(dá)爾文的《進(jìn)化論》中說人和猴子的祖先都是猿。但是人只能生人 猴子只能生猴子,雖然有共同的祖先,但是人類不等于猴類 我們也不能說人是猿。人不等于猿~ 那么List后面跟著一個類型變量T,就是指List只能持有指定類型的元素,如果T如果被String替代,那么List就只能持有String, 而List("猿“)和List ("人類")和List ("猴")雖然他們都是從List泛化而來。但是他們不相等,不同的"物種"。

List o=new ArrayList();`//error 不能成立 

有同學(xué)會說,這個例子太簡單了,能不能來一些有難度的。 其實(shí),我舉這個例子的初衷是讓大家知道---JDK開發(fā)人員引入泛型直到現(xiàn)在最大的好處就是為了解決容器轉(zhuǎn)型的麻煩,而且平時工作中我們用泛型最多的場景是和容器打交道。

非常好用的泛型方法

在定義List的接口源碼中我們可以看到如下方法:

 T[] toArray(T[] a);

這個方法的作用是把List中的所有元素轉(zhuǎn)存到另一個指定類型的數(shù)組中。List原本裝什么類型的元素,那么數(shù)組也裝同樣類型的元素,并且這里傳入的類型和返回值類型一致都是類型變量T[]。

那么泛型方法是如何定義的呢? 在上面代碼中,我們在返回值的前面類型參數(shù)標(biāo)簽來聲明定義一個泛型方法,其中T[]依次表示返回值的泛型類型和傳入的泛型類型參數(shù)。那么如何使用呢?看下面代碼:

List  usersGenertor=new ArrayList<>();
usersGenertor.add("zeng");
usersGenertor.add("armstrong");
String[] strings = usersGenertor.toArray(new String[10]);
for (String string : strings) {
    System.out.println("string:_"+string);
}

List  usersGenertor2=new ArrayList<>();
usersGenertor2.add(1);
usersGenertor2.add(2);
Integer[] ints = usersGenertor2.toArray(new Integer[3] );
for (Integer inta : ints) {
    System.out.println("Integer:_"+inta);
}

output:
string:_zeng
string:_armstrong
string:_null
string:_null
string:_null
string:_null
string:_null
string:_null
string:_null
string:_null
Integer:_1
Integer:_2
Integer:_null

上面的代碼中toArray方法分別傳入了String和Integer兩種不同的引用類型。它們并沒有重載,而且泛型中也不存在重載這一說法。暫時我們可以簡單的想象成String,Integer在編譯期間把T這個類型參數(shù)變量替換掉了。

除此之外,我們應(yīng)該盡量地多用泛型方法,而減少對整個類的泛化,因?yàn)榉盒头椒ǜ菀装咽虑檎f明白。

參考資料:

《Java編程思想第四版》

《Effective Java》

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/65641.html

相關(guān)文章

  • 聊聊Java泛型及實(shí)現(xiàn)

    摘要:靜態(tài)變量是被泛型類的所有實(shí)例所共享的。所以引用能完成泛型類型的檢查。對于這個類型系統(tǒng),有如下的一些規(guī)則相同類型參數(shù)的泛型類的關(guān)系取決于泛型類自身的繼承體系結(jié)構(gòu)。事實(shí)上,泛型類擴(kuò)展都不合法。 前言 和C++以模板來實(shí)現(xiàn)靜多態(tài)不同,Java基于運(yùn)行時支持選擇了泛型,兩者的實(shí)現(xiàn)原理大相庭徑。C++可以支持基本類型作為模板參數(shù),Java卻只能接受類作為泛型參數(shù);Java可以在泛型類的方法中取得...

    lewif 評論0 收藏0
  • 是你眼中的泛型嗎?

    摘要:得出的結(jié)論是兩個方法如果有相同的名稱和特征簽名,但返回值不同,那他們也是可以合法地共存于一個文件中的。同名方法參數(shù)個數(shù)順序類型不同,與返回值類型無關(guān)。這是來自中的一個例子。 繼《? extends T與? super T》之后,我們再聊聊泛型。 Demo 1 public interface Generator { T next(); } 第一種解決方法,在方法返回類型前加...

    alphahans 評論0 收藏0
  • 初探Java類型擦除

    摘要:可以看到,如果我們給泛型類制定了上限,泛型擦除之后就會被替換成類型的上限。相應(yīng)的,泛型類中定義的方法的類型也是如此。參考語言類型擦除下界通配符和的區(qū)別 本篇博客主要介紹了Java類型擦除的定義,詳細(xì)的介紹了類型擦除在Java中所出現(xiàn)的場景。 1. 什么是類型擦除 為了讓你們快速的對類型擦除有一個印象,首先舉一個很簡單也很經(jīng)典的例子。 // 指定泛型為String List list1 ...

    DevTalking 評論0 收藏0
  • 淺析Java泛型

    摘要:泛型類在類的申明時指定參數(shù),即構(gòu)成了泛型類。換句話說,泛型類可以看成普通類的工廠。的作用就是指明泛型的具體類型,而類型的變量,可以用來創(chuàng)建泛型類的對象。只有聲明了的方法才是泛型方法,泛型類中的使用了泛型的成員方法并不是泛型方法。 什么是泛型? 泛型是JDK 1.5的一項(xiàng)新特性,它的本質(zhì)是參數(shù)化類型(Parameterized Type)的應(yīng)用,也就是說所操作的數(shù)據(jù)類型被指定為一個參數(shù),...

    godiscoder 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<