泛型1

面向對象的語言的特性之一是代碼的重用,而支持代碼重用的一個重要的機制是泛型機制。若是在操做一個方法時能夠不去考慮對象的基本類型,方法的內在邏輯相同時能夠用泛型實現來描述這個方法。git

一,使用Object表示泛型:可使用像Object這樣適當的超類來實現泛型。如:數組

public class Test{對象

  public Object read(){接口

    return storedValue;編譯器

  }it

  public void write(Object x){io

    storedValue = x;編譯

  }ast

  private Object storedValue;class

}

其中需注意兩個細節:1,在使用write方法把一個Object或者其子類寫入後,此時用read()方法讀出的類型是Object類,若要讀出寫入的類型或者運用寫入類型的方法時則需進行強制轉化。2,不能使用基本類型做爲參數,由於基本類型與Object類型不能相容,若要使用基本類型,則需使用其包裝類。如:

public class TestDemo{

  public static void main( String[  ] args){

    Test test = new Test();

    test.write( new Integer( 18 ) ); 

    Integer digital = ( Integer) test.read();

    int val = digital.intValue();

    System.out,println(" Contents are: " + val );

  }

}

在這個例子中由於在調用write()方法前要先建立Integer對象因此代碼寫的很麻煩,在Java 5 之前若一個int類型的數據放到須要Integer對象的地方那麼編譯會出錯,而在Java 5 加入的自動裝箱和自動拆箱矯正了這個情形,若是將一個基本類型的變量放入須要使用包裝類的地方,編譯器將自動調用相對應的包裝類的構造方法,這就叫作自動裝箱。若是將一個包裝類插入到須要基本類型的地方,編譯器會調用包裝類中取出基本類型值的方法,這叫作自動拆箱。(但在對泛型類的實例化時不能使用基本類型。)

代碼修改成:

public class TestDemo{

  public static void main( String[  ] args){

    Test test = new Test();

    test.write( 18 );

    System.out,println(" Contents are: " + test.read() );

  }

}

二:使用接口類型表示泛型

通常只有在使用Object這樣的超類中所定義的方法能夠標示所執行的操做時才使用Object這樣的超類做爲泛型類型,例如須要在一些項中找出最大項的問題,這與項的類型無關,但它須要一種能力來比較任意兩個對象,並能肯定哪一個大哪一個小。可使用compareTo方法。它對全部的Comparable接口都是現成可用的,方法能夠寫爲:

public class FindMaxDemo{

  public static Comparable findMax( Comparable [ ] compare){

    int maxIndex = 0;

    for ( int i = 0 ; i < compare.length; i++ ){

      if (compare[maxIndex].compareTo[i] <  0){

        maxIndex = i;

      }

    }   

    return compare[maxIndex];

  }

}

若是使用這個方法找出最大項時首先須要注意,所傳入的數組元素必須實現Comparable接口,即便一個元素具備compareTo方法,但並未實現Comparable接口也不能做爲數組元素傳入。

其次數組中的對象必須相容,不然compareTo方法會拋出ClassCastException。

注意基本類型不能做爲Comparable進行傳入,而包裝類能夠,由於包裝類實現了Comparable接口。

注意接口做爲泛型時可使用自定義的接口,不必定須要使用標準的接口庫。

最後,使用接口表示泛型並不必定老是行得通,例若有的類是庫中的類,而接口是自定義的,這時沒法宣稱該類實現了接口。

相關文章
相關標籤/搜索