📜  Java中的泛型集(1)

📅  最后修改于: 2023-12-03 14:42:58.387000             🧑  作者: Mango

Java中的泛型集

什么是泛型?

Java中的泛型是在Java 5中引入的一种用于增强类型安全、代码重用性和可读性的特性。通过泛型,可以在编译时期检测出类型不匹配的错误,避免了在运行时期由于类型转换的错误而导致的异常。

泛型可以应用于类、接口和方法中。其中,类和接口可以定义泛型类型,方法可以使用泛型类型作为参数或返回值。

为什么需要泛型集?

Java中的集合框架提供了各种类型的集合,如List、Set、Map等。在使用集合时,我们经常需要将其中的元素类型进行限定,以避免类型不匹配的问题。比如,我们需要创建一个只能存放字符串类型的List集合,如果不使用泛型,我们需要手动进行类型转换,代码会比较冗长、且容易出错。

泛型集合就是针对此类问题而设计的。通过声明集合的类型参数,可以限定集合中的元素类型,当我们向集合中添加元素时,编译器会自动进行类型检查,并拒绝不符合类型参数限定的元素。

下面是一些常用的泛型集合类型:

List

List是一个有序的集合,允许元素重复。List接口允许通过索引来访问其中的元素,可以像数组一样使用下标进行访问。List接口中定义了一些常用的方法,如add、get、set、remove等。

在声明一个List对象时,需要指定List中元素的类型参数E。比如,声明一个只能存放字符串类型的List对象,可以使用以下代码:

List<String> list = new ArrayList<String>();
Set

Set是一个不允许元素重复的集合,其中的元素是无序的。Set接口中定义了一些常用的方法,如add、contains、remove等。

在声明一个Set对象时,需要指定Set中元素的类型参数E。比如,声明一个只能存放整型数值的Set对象,可以使用以下代码:

Set<Integer> set = new HashSet<Integer>();
Map<K,V>

Map是一种键值对映射的数据结构,其中的元素是无序的。Map接口中定义了一些常用的方法,如put、get、containsKey、containsValue等。

在声明一个Map对象时,需要指定Map中键和值的类型参数K和V。比如,声明一个以字符串类型为键,整型数值类型为值的Map对象,可以使用以下代码:

Map<String, Integer> map = new HashMap<String, Integer>();
泛型通配符

有时候,我们需要处理的数据类型并不是确定的,而是一些未知的类型。这时候,可以使用泛型通配符来表示不确定的类型。

泛型通配符的符号是“?”。通配符可以用于方法参数、成员变量、类继承等地方。它可以表示任何类型,但是在具体处理时需要根据具体情况进行判断和转换。

下面是一些常用的泛型通配符:

<? extends T>

表示任何继承于T类型的子类。(包括T本身)。

比如,可以声明一个接收任何继承于Number类型的List对象的方法:

public void printList(List<? extends Number> list) {
    // ...
}
<? super T>

表示任何T类型的父类(包括T本身)。

比如,可以声明一个接收任何类型的List对象,并将其中的元素转换成字符串类型的方法:

public void toString(List<? super String> list) {
    // ...
}
<?>

表示任何类型。可以用于定义泛型变量、方法参数等。

比如,可以定义一个泛型变量,可以接受任何类型的对象:

List<?> list = new ArrayList<>();
总结

Java中的泛型集提供了一种类型安全、代码可读性和可重用性的方案。通过使用泛型,可以让代码更加简洁、易读,减少因类型转换而产生的错误。在使用泛型集时,需要注意类型参数和泛型通配符的使用,以保证代码的正确性。