Java面试题
请解释一下Java中的泛型及其用途
Java中的泛型(Generics)是JDK 5.0引入的一个新特性,它的主要目标是创建可重用的组件,这些组件可以作用于多种数据类型。通过泛型,你可以在定义类、接口和方法时使用类型参数。这意味着,你可以创建一个泛型类,然后在创建这个类的实例时指定具体的类型参数。
泛型的主要用途和优点:
1、类型安全:使用泛型可以避免类型转换时的ClassCastException。在编译时,泛型可以确保类型安全,即在不需要程序员进行显式类型转换的情况下,类型匹配得到保证。
2、代码重用:通过泛型,你可以编写可重用的组件,这些组件可以处理多种数据类型,而无需为每个数据类型都编写新的代码。
3、消除冗余:泛型可以减少代码中的冗余。例如,你可以编写一个泛型集合类,它可以处理任何类型的对象,而不是分别为每个类型编写一个集合类。
4、提高性能:使用泛型可以避免装箱和拆箱操作,这可以提高程序的性能。
泛型的基本使用:
1、泛型类:你可以定义一个带有类型参数的类。例如:
public class Box<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
在这里,T是一个类型参数,你可以使用任何类型来实例化Box类。
2、泛型接口:与泛型类类似,接口也可以定义类型参数。
public interface MyInterface<T> {
void doSomething(T t);
}
3、泛型方法:你也可以在方法上使用泛型,而无需在类上使用。
public class GenericMethods {
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
}
在这个例子中,printArray方法是一个泛型方法,它可以接受任何类型的数组,并打印出数组中的每个元素。
4、泛型类型通配符:泛型类型通配符?用于表示不确定的类型。例如,在泛型集合中,你可以使用List<?>来表示一个元素类型不确定的列表。
5、类型边界:使用extends和super关键字,你可以为泛型类型设置上界和下界。例如,List<? extends Number>表示一个元素类型是Number或其子类的列表。
注意事项:
泛型信息在运行时会被擦除(Type Erasure),因此不能在运行时检查泛型类型。
泛型主要用于编译时的类型检查,而在运行时,所有的泛型类型参数都会被替换为它们的边界类型或Object。
通过使用泛型,Java程序员可以编写更加类型安全、可重用和灵活的代码。