1. 什么是泛型?
泛型(Generics)是 Java 中的一种特性,它允许我们在定义类、接口和方法时使用类型参数。通过使用泛型,我们可以编写更加通用和可复用的代码。
使用泛型的主要目的是增强代码的类型安全性和重用性:
Java 中的泛型是通过类型擦除来实现的。在编译期间,所有的泛型信息都会被擦除,替换成相应的边界类型或 Object 类型。这样做的好处是保持了与旧版本的兼容性,并且不会引入新的字节码指令。
例如,对于一个泛型类List<T>,在编译后的字节码中,所有的T都会被替换成其上限类型Object。这就意味着,在运行时无法获取到具体的泛型类型信息。
泛型通配符(Wildcard)是一种特殊的类型参数,用于表示未知类型或不确定类型。在 Java 中,有三种泛型通配符:
?:表示任意类型。 ? extends T:表示某个类的子类或该类本身。 ? super T:表示某个类的父类或该类本身。 通过使用泛型通配符,我们可以编写更加灵活和通用的代码,使得方法能够接受多种类型的参数。
下面是一个简单的示例,展示了泛型和通配符的使用方式:
public class GenericExample {
public static <T> void printList(List<T> list) {
for (T item : list) {
System.out.println(item);
}
}
public static void printWildcardList(List<?> list) {
for (Object item : list) {
System.out.println(item);
}
}
public static void main(String[] args) {
List<Integer> intList = Arrays.asList(1, 2, 3);
List<String> stringList = Arrays.asList("Hello", "World");
printList(intList); // 打印整数列表
printList(stringList); // 打印字符串列表
printWildcardList(intList); // 使用通配符打印整数列表
printWildcardList(stringList); // 使用通配符打印字符串列表
}
}在上述示例中,printList方法使用了泛型参数<T>,可以接受任意类型的列表作为参数,并打印出列表中的元素。
而printWildcardList方法使用了通配符?,可以接受任意类型的列表作为参数,并打印出列表中的元素。由于通配符是不确定的类型,所以只能使用Object来引用其中的元素。
<T>来表示类型参数。 泛型是 Java 中一种强大的特性,通过使用泛型,我们可以编写更加通用、灵活和类型安全的代码。泛型通配符则进一步增强了代码的灵活性和重用性,使得方法能够接受多种类型的参数。然而,过度使用泛型和通配符可能会导致代码复杂化,需要根据实际情况进行权衡和选择。
[1]
首发博客地址: https://blog.zysicyj.top/
[2]
面试题手册: https://store.amazingmemo.com/chapterDetail/1685324709017001
[3]
系列文章地址: https://blog.zysicyj.top/categories/技术文章/后端技术/系列文章/面试题精讲/