集合泛型
集合泛型
在Java中,泛型(Generics)是一种强大的特性,它允许程序员在编译时进行类型安全检查。当泛型应用于集合时,可以确保集合中只能存储指定类型的元素,从而避免了类型转换的错误和运行时异常。
泛型的基本使用
泛型在使用时通常遵循以下格式:
GenericClass<Type> object = new GenericClass<>();
这里的 Type
是一个类型参数,它可以是任何有效的Java类型,包括类(class)、接口(interface)、基本数据类型(int, double 等)。
集合中的泛型
在集合框架中,泛型允许你指定集合中元素的类型。例如,你可以创建一个存储 String
类型元素的 List
或 Set
:
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
类型或其父类型的列表。
泛型接口和类
集合框架中的泛型接口和类,如 List
、Set
、Map
等,都使用泛型来定义元素的类型。例如:
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