Java泛型类的使用

igxiaoshan Lv5

Java泛型的使用

Java的泛型(Generics)是Java语言的一种特性,允许类、接口和方法可以操作指定类型的对象,而无需定义具体的类型。

通过使用泛型,可以编写更通用、可重用的代码,同时在编译时提供类型安全检查

主要特性

1、类型参数化

泛型允许你在类、接口和方法定义中使用一个或多个类型参数,这些类型参数在实例化时被具体划分为具体的类型。

示例

1
2
3
4
5
6
7
8
9
10
11
public class Box<T> {
private T item;

public void set(T item) {
this.item = item;
}

public T get() {
return item;
}
}

使用: T是一个类型参数,它可以是任意类型。实例化时,可以指定T的具体类型。

1
2
3
4

Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String value = stringBox.get();

2、类型安全

使用泛型可以在编译时就检测到类型不匹配的错误,避免了运行时的ClassCastException

例如,如果你试图将一个Integer放入到Box<String>中,编译器会立即报错。

3、消除强制类型转换

泛型减少了对类型转换的需求。因为在定义泛型时已经指定了类型,取出对象时不再需要手动进行类型转换

1
2
3
4
5
6
7
8
9
10
// 不使用泛型时:
List list = new ArrayList();
list.add("Hello");
String str = (String) list.get(0); // 需要强制类型转换

// 使用泛型时:
List<String> list = new ArrayList<>();
list.add("Hello");
String str = list.get(0); // 不需要强制类型转换

4、通配符与边界

Java泛型提供了通配符(?)来表示未知类型,并且可以使用extendsspuer关键字指定上界和下界

  • ? extends T:表示可以接受 T 或者 T 的子类。
  • ? super T:表示可以接受 T 或者 T 的父类。
1
2
3
4
5
6
public void process(List<? extends Number> list) {
for (Number number : list) {
System.out.println(number);
}
}

5、类型擦除

Java泛型在编译时会进行类型擦除(Type Erasure),即在编译过程中,泛型类型信息会被移除,泛型的类型参数会被替换成Object或者边界类型。

这意味着在运行时,泛型类型的信息不可用

总结

  • 当你希望类、接口或者方法可以操作多种类型的时候可以使用泛型
  • 当你希望在编译时进行类型检查以确保类型安全的时候可以使用泛型

泛型使得代码更加灵活和安全,是Java中非常重要的特性之一。