集合泛型

集合泛型


在Java中,泛型(Generics)是一种强大的特性,它允许程序员在编译时进行类型安全检查。当泛型应用于集合时,可以确保集合中只能存储指定类型的元素,从而避免了类型转换的错误和运行时异常。

泛型的基本使用

泛型在使用时通常遵循以下格式:

GenericClass<Type> object = new GenericClass<>();

这里的 Type 是一个类型参数,它可以是任何有效的Java类型,包括类(class)、接口(interface)、基本数据类型(int, double 等)。

集合中的泛型

在集合框架中,泛型允许你指定集合中元素的类型。例如,你可以创建一个存储 String 类型元素的 ListSet

List<String> stringList = new ArrayList<>();
Set<Integer> integerSet = new HashSet<>();

泛型方法

Java中的集合类也提供了泛型方法,这些方法可以操作泛型类型的参数和返回值。例如,Collections.sort() 方法可以对泛型类型的列表进行排序:

List<String> strings = Arrays.asList("banana", "apple", "cherry");
Collections.sort(strings); // strings 是一个泛型列表

通配符

Java泛型还支持使用通配符(?),这允许你创建可以操作多种类型的集合。通配符的使用场景包括:

  • 无限制通配符List<?> 表示可以包含任何类型的列表。
  • 上界限定List<? extends Number> 表示可以包含 Number 类型或其子类型的列表。
  • 下界限定List<? super String> 表示可以包含 String 类型或其父类型的列表。

泛型接口和类

集合框架中的泛型接口和类,如 ListSetMap 等,都使用泛型来定义元素的类型。例如:

Map<String, List<String>> map = new HashMap<>();
map.put("fruits", Arrays.asList("apple", "banana"));

泛型的类型擦除

Java泛型在编译时提供类型安全,但在运行时,类型信息会被擦除。这意味着在运行时,你不能通过反射来获取泛型的确切类型。例如:

List<String> list = new ArrayList<>();
list.add("hello");
String s = list.get(0); // 直接使用,无需类型转换

// 运行时,list的类型参数被擦除
System.out.println(list.getClass() == ArrayList.class); // true
System.out.println(list.getClass() == ArrayList<String>.class); // false
posted @ 2024-08-06 10:29  墨澜  阅读(7)  评论(0编辑  收藏  举报