1. 泛型的定义
- 泛型(Generics) 是 Java 5 引入的特性,允许在定义类、接口和方法时使用类型参数。
- 泛型的核心目的是提高代码的复用性和类型安全性。
- 示例:
public class Box<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
2. 泛型的作用
- 类型安全:在编译时检查类型,避免运行时类型转换错误。
- 代码复用:通过类型参数化,实现代码的通用性。
- 减少强制类型转换:泛型可以避免显式的类型转换。
3. 泛型的实现原理
- 类型擦除(Type Erasure):
- Java 泛型是通过类型擦除实现的,即在编译时将所有泛型类型参数替换为它们的上限(默认是
Object
)。 - 如果泛型类型参数有上限(如
<T extends Number>
),则替换为上限类型(如Number
)。 - 示例:
- Java 泛型是通过类型擦除实现的,即在编译时将所有泛型类型参数替换为它们的上限(默认是
public class Box<T> {
private T value;
// 编译后:private Object value;
}
- 桥方法(Bridge Methods):
- 为了保证泛型类型擦除后的多态性,编译器会生成桥方法。
- 示例:
public interface Comparable<T> {
int compareTo(T o);
}
public class MyClass implements Comparable<MyClass> {
@Override
public int compareTo(MyClass o) {
// 实现逻辑
}
}
4. 泛型的限制
- 基本类型不能作为泛型参数:
- 泛型类型参数必须是引用类型,不能是基本类型(如
int
、char
)。 - 解决方案:使用包装类(如
Integer
、Character
)。
- 泛型类型参数必须是引用类型,不能是基本类型(如
- 不能创建泛型类型的实例:
- 由于类型擦除,无法直接创建泛型类型的实例。
- 示例:
T obj = new T(); // 错误
- 不能创建泛型数组:
- 由于类型擦除,无法直接创建泛型数组。
- 示例:
T[] array = new T[10]; // 错误
5. 泛型的通配符
<?>
:无界通配符,表示任意类型。<? extends T>
:上界通配符,表示T
或其子类型。<? super T>
:下界通配符,表示T
或其父类型。- 示例:
public void printList(List<?> list) {
for (Object item : list) {
System.out.println(item);
}
}
6. 泛型的应用场景
- 集合类:如
List<T>
、Map<K, V>
。 - 工具类:如
Comparator<T>
、Callable<T>
。 - 自定义泛型类和接口:如
Box<T>
。
示例代码
public class GenericExample {
public static void main(String[] args) {
Box<Integer> intBox = new Box<>();
intBox.setValue(10);
System.out.println(intBox.getValue()); // 输出:10
Box<String> strBox = new Box<>();
strBox.setValue("Hello");
System.out.println(strBox.getValue()); // 输出:Hello
}
}
class Box<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
总结
- 泛型 是 Java 中用于实现类型参数化的特性,提高代码的复用性和类型安全性。
- 实现原理:通过类型擦除在编译时将泛型类型参数替换为上限类型,并生成桥方法保证多态性。
- 限制:不能使用基本类型、不能创建泛型类型实例和数组。
- 通配符:
<?>
、<? extends T>
、<? super T>
用于增强泛型的灵活性。
THE END
暂无评论内容