半小時通透Java的泛型_第1頁
半小時通透Java的泛型_第2頁
半小時通透Java的泛型_第3頁
半小時通透Java的泛型_第4頁
半小時通透Java的泛型_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第半小時通透Java的泛型Exceptioninthread“main”java.lang.ClassCastException:java.lang.Integercannotbecasttojava.lang.String

atcom.caq.oop.demo08.Test.main(Test.java:12)

由于我們的“疏忽”,列表第1個元素實際上是整型,但被我們強制轉換為字符串類型,這是行不通的,因此會拋出ClassCastException異常。

使用泛型可以解決這些問題。泛型有如下優(yōu)點:

可以減少類型轉換的次數(shù),代碼更加簡潔;

程序更加健壯:只要編譯期沒有警告,運行期就不會拋出ClassCastException異常;

提高了代碼的可讀性:編寫集合的時候,就限定了集合中能存放的類型。

3.如何使用泛型

3.1泛型使用

在代碼中,這樣使用泛型:

ListStringlist=newArrayListString

//Java7及以后的版本中,構造方法中可以省略泛型類型:

ListStringlist=newArrayList();

要注意的是,變量聲明的類型必須與傳遞給實際對象的類型保持一致,下面是錯誤的例子:

ListObjectlist=newArrayListString

ListNumbernumbers=newArrayList(Integer);

3.2自定義泛型類

3.2.1Java源碼中泛型的定義

在自定義泛型類之前,我們來看下java.util.ArrayList是如何定義的:

類名后面的E就是泛型的定義,E不是Java中的一個具體的類型,它是Java泛型的通配符(注意是大寫的,實際上就是Element的含義),可將其理解為一個占位符,將其定義在類上,使用時才確定類型。

此處的命名不受限制,但最好有一定含義,例如java.lang.HashMap的泛型定義為HashMapK,V,K表示Key,V表示Value。

3.2.2自定義泛型類實例1

下面我們來自定義一個泛型類,自定義泛型按照約定俗成可以叫T,具有Type的含義,實例如下:

實例演示

packagecom.caq.List;

publicclassGeneric01T{

privateTabc;//定義在類上的泛型,在類內部可以使用

publicTgetAbc(){

returnabc;

publicvoidsetAbc(Tabc){

this.abc=abc;

publicstaticvoidmain(String[]args){

//實例化對象,指定元素類型為整型

Generic01IntegerintegerGeneric01=newGeneric01();

//調用方法

integerGeneric01.setAbc(100);

System.out.println("integerGeneric01="+integerGeneric01.getAbc());

//實例化對象,指定元素類型為長類型

Generic01LonglongGeneric01=newGeneric01();

longGeneric01.setAbc(200L);

System.out.println("longGeneric01="+longGeneric01.getAbc());

//實例化對象,指定元素類型為雙精度浮點型

Generic01DoubledoubleGeneric01=newGeneric01();

doubleGeneric01.setAbc(300.0);

System.out.println("doubleGeneric01="+doubleGeneric01.getAbc());

運行結果:

integerGeneric01=100

longGeneric01=200

doubleGeneric01=300.0

我們在類的定義處也定義了泛型:Generic01T;在類內部定義了一個T類型的abc變量,并且為其添加了setter和getter方法。

解釋:對于泛型類的使用也很簡單,在主方法中,創(chuàng)建對象的時候指定T的類型分別為Integer、Long、Double,類就可以自動轉換成對應的類型了。

3.2.3自定義泛型類實例2

上面我們知道了如何定義含有單個泛型的類,那么對于含有多個泛型的類,如何定義呢?

我們可以看一下HashMap類是如何定義的。如下是Java源碼的截圖:

參照HashMapK,V類的定義,下面我們來看看如何定義含有兩個泛型的類

packagecom.caq.List;

publicclassGeneric02K,V{//這次是定義兩個泛型在類上

//定義類型為K的key屬型

privateKkey;

//定義類型為V的value屬型

privateVvalue;

//封裝里的知識,通過Getter和Setter方法來設置和獲取私有屬型的值

publicKgetKey(){

returnkey;

publicvoidsetKey(Kkey){

this.key=key;

publicVgetValue(){

returnvalue;

publicvoidsetValue(Vvalue){

this.value=value;

publicstaticvoidmain(String[]args){

//實例化對象,分別指定類型為整型,長整型

Generic02Integer,LongintegerLongGeneric02=newGeneric02();

//實例化對象,分別指定類型為浮點型、字符串類型

Generic02Float,StringfloatStringGeneric02=newGeneric02();

integerLongGeneric02.setKey(100);

integerLongGeneric02.setValue(200L);

System.out.println("key="+integerLongGeneric02.getKey());

System.out.println("value="+integerLongGeneric02.getValue());

floatStringGeneric02.setKey(0.9f);

floatStringGeneric02.setValue("巴啦啦能量");

System.out.println("key="+floatStringGeneric02.getKey());

System.out.println("value="+floatStringGeneric02.getValue());

運行結果:

key=100value=200key=0.9value=巴啦啦能量

3.3自定義泛型方法

前面我們知道了如何定義泛型類,在類上定義的泛型,在方法中也可以使用。下面我們來看一下如何自定義泛型方法。

泛型方法不一定寫在泛型類當中。當類的調用者總是關心類中的某個泛型方法,不關心其他屬性,這個時候就沒必要再整個類上定義泛型了。

直接在方法上設置泛型(generic)

packagecom.caq.List;publicclassGeneric03{publicTvoidtest(Tt){System.out.println(t);}publicstaticvoidmain(String[]args){Generic03generic03=newGeneric03();generic03.test("Monkey");generic03.test(1);generic03.test(1.00000);generic03.test(1L);}}

運行結果:

Monkey11.01

實例中,使用T來定義test方法的泛型,它接收一個泛型的參數(shù)變量并在方法體打??;調用泛型方法也很簡單,在主方法中實例化對象,調用對象下的泛型方法,可傳入不同類型的參數(shù)。

4.泛型類的子類

泛型類也是一個Java類,它也具有繼承的特性。

泛型類的繼承可分為兩種情況:

子類明確泛型類的類型參數(shù)變量;

子類不明確泛型類的類型參數(shù)變量。

4.1明確類型參數(shù)變量

例如,有一個泛型接口:

packagecom.caq.List;publicinterfaceGenericInterface01T{defaultvoidshow(Tt){}}

泛型接口的實現(xiàn)類如下:

packagecom.caq.List;publicclassGenericInterfaceImpleimplementsGenericInterface01String{@Overridepublicvoidshow(Strings){System.out.println(s);}}

子類實現(xiàn)明確了泛型的參數(shù)變量為String類型。因此方法show()的重寫也將T替換為了String類型。

4.2不明確類型參數(shù)變量

當實現(xiàn)類不確定泛型類的參數(shù)變量時,實現(xiàn)類需要定義類型參數(shù)變量,調用者使用子類時,也需要傳遞類型參數(shù)變量。

如下是GenericInterface接口的另一個實現(xiàn)類:

packagecom.caq.List;

publicclassGenericInterfaceImpleTimplementsGenericInterface01T{

@Override

publicvoidshow(Tt){

System.out.println(t);

在主方法中調用實現(xiàn)類的show()方法:

packagecom.caq.List;

publicclassGenericInterfaceImpleTimplementsGenericInterface01T

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論