如果我們可以寫一個(gè)單獨(dú)的能在一個(gè)整型數(shù)組,一個(gè)字符串?dāng)?shù)組或者一個(gè)任何類型支持排序的數(shù)組內(nèi)排列元素的排序方法將會(huì)是很好的。
Java Generic 方法和 generic 類讓程序員可以用一種單獨(dú)的方法聲明,一系列有關(guān)的方法或者用一個(gè)單獨(dú)的類聲明來各自指定一系列有關(guān)的類型。
Generic 也提供了編譯時(shí)類型安全來允許程序員在編譯時(shí)捕獲無效的類型。
使用 Java Generic 概念,我們可以寫一個(gè)泛型方法來給對象數(shù)組排序,然后調(diào)用帶有整型數(shù)組,double 型數(shù)組,字符串?dāng)?shù)組或其他的泛型方法來為數(shù)組元素排序。
你可以寫一個(gè)單獨(dú)的可以被不同類型的參數(shù)調(diào)用的泛型方法聲明?;趥鹘o泛型方法的參數(shù)類型,編譯器正確處理每個(gè)調(diào)用的方法。以下是定義泛型方法的規(guī)則:
以下的例子說明了我們可以通過一個(gè)通用的方法來打印不同類型的數(shù)組:
public class GenericMethodTest
{
// generic method printArray
public static < E > void printArray( E[] inputArray )
{
// Display array elements
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
public static void main( String args[] )
{
// Create arrays of Integer, Double and Character
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
System.out.println( "Array integerArray contains:" );
printArray( intArray ); // pass an Integer array
System.out.println( "\nArray doubleArray contains:" );
printArray( doubleArray ); // pass a Double array
System.out.println( "\nArray characterArray contains:" );
printArray( charArray ); // pass a Character array
}
}
這將產(chǎn)生以下結(jié)果:
Array integerArray contains:
1 2 3 4 5 6
Array doubleArray contains:
1.1 2.2 3.3 4.4
Array characterArray contains:
H E L L O
有時(shí)候你想要限制允許傳給一個(gè)類型參數(shù)的類型種類。例如,操作數(shù)的方法可能僅僅想要接受 Number 的實(shí)例或者它的子類。這就是有限的類型參數(shù)。
聲明一個(gè)有限的類型參數(shù),列舉類型參數(shù)的名字,后面跟著擴(kuò)展關(guān)鍵字和它的上界。
下面的例子說明了如何使用擴(kuò)展在一定意義上意味著“繼承”(在類中)或是在“實(shí)現(xiàn)”(在接口中)。這個(gè)例子是返回三個(gè) Comparable 對象中最大的泛型方法:
public class MaximumTest
{
// determines the largest of three Comparable objects
public static <T extends Comparable<T>> T maximum(T x, T y, T z)
{
T max = x; // assume x is initially the largest
if ( y.compareTo( max ) > 0 ){
max = y; // y is the largest so far
}
if ( z.compareTo( max ) > 0 ){
max = z; // z is the largest now
}
return max; // returns the largest object
}
public static void main( String args[] )
{
System.out.printf( "Max of %d, %d and %d is %d\n\n",
3, 4, 5, maximum( 3, 4, 5 ) );
System.out.printf( "Maxm of %.1f,%.1f and %.1f is %.1f\n\n",
6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );
System.out.printf( "Max of %s, %s and %s is %s\n","pear",
"apple", "orange", maximum( "pear", "apple", "orange" ) );
}
}
這將會(huì)產(chǎn)生以下結(jié)果:
Maximum of 3, 4 and 5 is 5
Maximum of 6.6, 8.8 and 7.7 is 8.8
Maximum of pear, apple and orange is pear
泛型類的聲明看起來像一個(gè)非泛型類的聲明,除了類名后跟著一個(gè)類型參數(shù)區(qū)域。
與泛型方法一樣,一個(gè)泛型類的類型參數(shù)區(qū)域可以擁有一個(gè)或者更多的由逗號(hào)分隔的類型參數(shù)。這些類被稱為參數(shù)化的類或是參數(shù)化的類型因?yàn)樗麄兘邮芤粋€(gè)或更多的參數(shù)。
下面的例子說明了我們怎樣定義一個(gè)泛型類:
public class Box<T> {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
Box<String> stringBox = new Box<String>();
integerBox.add(new Integer(10));
stringBox.add(new String("Hello World"));
System.out.printf("Integer Value :%d\n\n", integerBox.get());
System.out.printf("String Value :%s\n", stringBox.get());
}
}
這將產(chǎn)生以下結(jié)果:
Integer Value :10
String Value :Hello World