如果我们可以编写一个单一的排序方法,该方法可以对 Integer
数组、String
数组或任何支持排序类型的数组进行排序,那将会非常方便。
泛型在 Java 中的用途
Java 中的泛型用于创建能够操作不同类型数据的类、接口和方法。这一特性是在 Java 5 中引入的。
Java 泛型
Java 泛型方法和泛型类允许程序员通过单一的方法声明定义一组相关的方法,或者通过单一的类声明定义一组相关的类型。
泛型还提供了编译时类型安全,使得程序员可以在编译时捕捉到无效类型。
利用 Java 泛型概念,我们可以编写一个通用方法来对对象数组进行排序,然后用 Integer
数组、Double
数组、String
数组等调用该泛型方法来对数组元素进行排序。
泛型的优势
Java 泛型的种类
泛型方法
你可以编写一个可以接受不同类型参数的单一泛型方法声明。根据传递给泛型方法的参数类型,编译器会适当地处理每个方法调用。
定义泛型方法的规则
-
所有的泛型方法声明都有一个由尖括号(< 和 >)界定的类型参数部分,该部分位于方法返回类型之前(如示例中的
<E>
)。
-
每个类型参数部分包含一个或多个由逗号分隔的类型参数。类型参数也被称为类型变量,它们指定了一个泛型类型名。
-
类型参数可以用来声明返回类型,并作为传递给泛型方法的实际类型参数的占位符。
-
泛型方法的主体像其他任何方法一样声明。注意类型参数只能代表引用类型,不能代表原始类型(如
int
、double
和 char
)。
泛型方法示例
以下示例说明了如何使用单一的泛型方法打印不同类型的数组:
public class GenericMethodTest {
public static <E> void printArray(E[] inputArray) {
for (E element : inputArray) {
System.out.printf("%s ", element);
}
System.out.println();
}
public static void main(String args[]) {
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);
System.out.println("\nArray doubleArray contains:");
printArray(doubleArray);
System.out.println("\nArray characterArray contains:");
printArray(charArray);
}
}
输出
Array integerArray contains:
1 2 3 4 5
Array doubleArray contains:
1.1 2.2 3.3 4.4
Array characterArray contains:
H E L L O
有界类型参数
有时,你可能希望限制可以传递给类型参数的类型种类。例如,只接受 Number
或其子类实例的方法。这就是有界类型参数的作用。
要声明一个有界的类型参数,列出类型参数的名字,后跟 extends
关键字,再后跟它的上限。
有界类型参数示例
以下示例说明了如何使用 extends
在一般意义上表示要么是“继承”(对于类而言),要么是“实现”(对于接口而言)。此示例是一个通用方法,用于返回三个可比较对象中的最大值:
public class MaximumTest {
public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
T max = x;
if (y.compareTo(max) > 0) {
max = y;
}
if (z.compareTo(max) > 0) {
max = z;
}
return max;
}
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("Max 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"));
}
}
输出
Max of 3, 4 and 5 is 5
Max of 6.6,8.8 and 7.7 is 8.8
Max of pear, apple and orange is pear
泛型类
泛型类声明看起来像非泛型类声明,只是类名后面跟着一个类型参数部分。
如同泛型方法一样,泛型类的类型参数部分可以包含一个或多个由逗号分隔的类型参数。这些类被称为参数化类或参数化类型,因为它们接受一个或多个参数。
泛型类示例
以下示例说明了如何定义一个泛型类:
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());
}
}
输出
Integer Value :10
String Value :Hello World