1. 什么是泛型?
泛型(Generics) 是一种在编程语言中用于创建可重用代码的机制。它允许我们定义类、接口和方法,可以使用不同类型的参数进行操作,从而提高代码的灵活性和复用性。
在 Java 中,泛型通过使用尖括号<>来指定类型参数。例如,List<String>
表示一个只能存储字符串类型元素的列表。
在没有泛型的情况下,我们可能需要为每个数据类型都编写相应的类或方法,这样会导致代码冗余,并且难以维护。而有了泛型,我们可以将类型作为参数传递给类或方法,使其具有通用性,可以处理多种类型的数据。
泛型的主要目的是增加代码的安全性和可读性。通过在编译时检查类型,可以避免在运行时出现类型转换错误,并提供更好的代码提示和文档说明。
Java 中的泛型是通过类型擦除(Type Erasure)来实现的。在编译过程中,所有的泛型类型信息都被擦除,替换成它们的上界(或者 Object 类型)。这意味着在运行时无法获取到泛型的具体类型信息。
例如,对于List<String>
,在编译后会被擦除为List<Object>
。这样做的好处是可以保持与旧版本 Java 代码的兼容性,并且减少了运行时的开销。
尽管泛型的类型信息在运行时被擦除了,但编译器仍然会进行类型检查来确保类型安全。这是通过插入强制类型转换和辅助方法来实现的。
下面是一个简单的示例,展示了如何使用泛型创建一个通用的列表类:
public class MyList<T> {
private T[] elements;
private int size;
public MyList() {
elements = (T[]) new Object[10];
size = 0;
}
public void add(T element) {
elements[size] = element;
size++;
}
public T get(int index) {
return elements[index];
}
}
在上面的示例中,我们使用<T>
定义了一个类型参数,它表示该类可以处理任意类型的元素。在构造函数中,我们使用(T[]) new Object[10]
创建了一个泛型数组,通过强制类型转换将其转换为指定类型。
Map<K, V>
表示键值对中的键和值可以是不同的类型。 泛型是一种在编程语言中用于创建可重用代码的机制,它可以增加代码的灵活性、复用性和安全性。Java 中的泛型通过类型擦除来实现,在编译过程中会将泛型类型信息擦除,并插入强制类型转换和辅助方法来确保类型安全。尽管泛型有一些限制和缺点,但它仍然是一种非常有用的特性。
[1]
首发博客地址: https://blog.zysicyj.top/
[2]
面试题手册: https://store.amazingmemo.com/chapterDetail/1685324709017001
[3]
系列文章地址: https://blog.zysicyj.top/categories/技术文章/后端技术/系列文章/面试题精讲/