面向對象的語言的特性之一是代碼的重用,而支持代碼重用的一個重要的機制是泛型機制。若是在操做一個方法時能夠不去考慮對象的基本類型,方法的內在邏輯相同時能夠用泛型實現來描述這個方法。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接口。
注意接口做爲泛型時可使用自定義的接口,不必定須要使用標準的接口庫。
最後,使用接口表示泛型並不必定老是行得通,例若有的類是庫中的類,而接口是自定義的,這時沒法宣稱該類實現了接口。