写一个输出数组的方法。但是数组的类型有很多,如int ,double,float,字符串等等。为了输出不同类型的数组,我们需要些很多种方法,但其实这些方法除了数组类型不同,其余都是相同的,这是方法重载。
public class InputArrayTest {
public static void printArray(int[] inputArray){
for (int array:inputArray){
System.out.print(array+" ");
}
System.out.println();
}
public static void printArray(double[] inputArray){
for (double array:inputArray){
System.out.print(array+" ");
}
System.out.println();
}
public static void printArray(String[] inputArray){
for (String array:inputArray){
System.out.print(array+" ");
}
System.out.println();
}
public static void main(String[] args) {
int a[]={1,2,3};
double b[]={1.1,2.2,3.3};
String c[]={"a","b","c"};
printArray(a);
printArray(b);
printArray(c);
}
}
显然,方法重载就是一种浪费。那么我们是不是可以只写一个方法,却可以让他处理不同类型的数组呢。这就是泛型的作用。
public class InputArrayTestTwo {
public static <E> void printArray( E[] inputArray )
{
for ( E element : inputArray ){
System.out.print(element+" " );
}
System.out.println();
}
public static void main(String[] args) {
Integer[] intArray={1,2,3};
Double[] doubleArray={1.1,2.2,3.3};
String[] stringArray={"a","b","c"};
printArray(intArray);
printArray(doubleArray);
printArray(stringArray);
}
}
也许,有的时候,即使我们希望一个方法可以处理多种类型参数,但同时也希望有个限制,因此就有了有界的类型参数。例如我们只希望数组输出的对象是数字,字符串不允许输出。
可能有时候,你会想限制那些被允许传递到一个类型参数的类型种类范围。例如,一个操作数字的方法可能只希望接受Number或者Number子类的实例。这就是有界类型参数的目的。
要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界。
public class InputArrayTest{
public static <E extends Number> void printArray( E[] inputArray )
{
for ( E element : inputArray ){
System.out.print(element+" " );
}
System.out.println();
}
public static void main(String[] args) {
Integer[] intArray={1,2,3};
Double[] doubleArray={1.1,2.2,3.3};
printArray(intArray);
printArray(doubleArray);
}
}
以上均是泛型方法。
下面是泛型类
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());
}
}