泛型是在Java 5中引入的。Java 5发布于2004年9月30日,是Java语言的一个重要版本,其中引入了泛型、自动装箱、枚举类型、注解等新特性,大大提高了Java语言的功能和表现力。泛型是Java 5中最重要的新特性之一,它使得Java语言可以更好地支持类型安全和代码重用。
Java中的泛型是一种参数化类型的概念,它允许在定义类、接口和方法时使用类型参数,以便在使用时可以指定具体的类型。泛型可以提高代码的可读性和安全性,同时也可以减少代码的重复性。
泛型的作用主要有以下几个方面:
-
类型安全:泛型可以在编译时检查类型,避免了在运行时出现类型转换异常的情况。
-
代码重用:使用泛型可以编写通用的代码,避免了重复编写相同功能的代码。
-
程序可读性:使用泛型可以使代码更加简洁易读,同时也能够提高代码的可读性和可维护性。
-
性能优化:使用泛型可以避免类型转换,提高程序的执行效率。
泛型的主要作用是在编译时检查类型,避免了在运行时出现类型转换异常的情况,同时也可以减少代码的重复性。下面是一个泛型类的示例:
public class Box<T> {
private T item;
public Box(T item) {
this.item = item;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
在这个示例中,Box类是一个泛型类,使用了类型参数T。T可以在实例化时指定具体的类型,例如:
Box<Integer> integerBox = new Box<Integer>(10);
Box<String> stringBox = new Box<String>("hello");
在实例化时,分别传入了整型和字符串类型作为泛型参数。这样,就可以在Box类中使用T作为类型参数,而不需要指定具体的类型。例如,可以在Box类中使用T类型的变量item,而不需要指定它的具体类型。在实例化时,item的类型将根据传入的泛型参数进行推断。
Integer item = integerBox.getItem();
String item = stringBox.getItem();
通过getItem方法,可以获取Box实例中存储的元素,而不需要进行类型转换。这是因为在实例化时,泛型参数已经指定了具体的类型,因此可以在编译时检查类型,避免了在运行时出现类型转换异常的情况。
Java中的泛型有以下几种使用方式:
- 泛型类:在类声明时,使用类型参数来定义类,从而实现泛型。
public class Box<T> {
private T item;
public Box(T item) {
this.item = item;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
- 泛型接口:在接口声明时,使用类型参数来定义接口,从而实现泛型。
public interface List<T> {
int size();
T get(int index);
void add(T element);
}
- 泛型方法:在方法声明时,使用类型参数来定义方法,从而实现泛型。
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.print(element + " ");
}
System.out.println();
}
- 通配符:在使用泛型时,可以使用通配符来表示任意类型。通配符有三种类型:?、? extends T、? super T。
public static void printList(List<?> list) {
for (Object element : list) {
System.out.print(element + " ");
}
System.out.println();
}
public static void copy(List<? extends Number> dest, List<? extends Number> src) {
for (int i = 0; i < src.size(); i++) {
dest.set(i, src.get(i));
}
}
总之,泛型的使用方式很灵活,可以根据实际需求选择不同的方式来实现泛型。