在泛型编程中,我们经常会遇到这样的情况:你希望编写一个方法,它可以接受多种类型的泛型集合,而不需要为每一种类型都编写一个单独的方法。比如,你可能有一个方法需要处理List<Integer>、List<Double>,甚至是List<String>。这时,通配符就派上了用场。
Java中的通配符主要有三种形式:
「无界通配符(Unbounded Wildcard)」:<?>「上界通配符(Upper Bounded Wildcard)」:<? extends T>「上界通配符(上界通配符)」:<?延伸T>「下界通配符(Lower Bounded Wildcard)」:<? super T>「下界通配符(Lower Bounded Wildcard)」:<?超级T>接下来,我将逐一解释这三种通配符的使用场景,并通过代码示例展示它们的实际应用。
1. 无界通配符 <?>无界通配符表示“任意类型”。它通常用于你只关心泛型结构本身,而不关心具体类型的情况。比如,你想编写一个方法来打印一个List中的所有元素,而不关心这个List是List<Integer>还是List<String>。
public void printList(List<?> list){ for (Object elem : list) { System.out.println(elem); }}
这个方法可以接受任何类型的List,无论是List<Integer>、List<String>,还是List<Object>。
2. 上界通配符 <? extends T>上界通配符表示“某个类型或其子类型”。它通常用于你希望限制泛型类型的上限,从而确保类型安全。比如,你想编写一个方法来计算一个List中所有数字的总和。
public double sumOfList(List<? extends Number> list){ double sum = 0.0; for (Number num : list) { sum += num.doubleValue(); } return sum;}
这个方法可以接受List<Integer>、List<Double>等任何Number的子类型的List。通过使用<? extends Number>,我们确保了List中的元素都是Number或其子类,从而可以安全地调用doubleValue()方法。
3. 下界通配符 <? super T>下界通配符表示“某个类型或其父类型”。它通常用于你希望限制泛型类型的下限,从而确保类型安全。比如,你想编写一个方法来向一个List中添加元素。
public void addNumbers(List<? super Integer> list){ for (int i = 1; i <= 10; i++) { list.add(i); }}
这个方法可以接受List<Integer>、List<Number>,甚至是List<Object>。通过使用<? super Integer>,我们确保了List中的元素至少是Integer类型或其父类,从而可以安全地添加Integer类型的元素。
通配符的实际应用案例案例1:处理多种类型的集合假设你正在开发一个数据处理工具,需要处理多种类型的集合。你可以使用无界通配符来编写一个通用的处理方法。
public void processCollection(Collection<?> collection){ for (Object item : collection) { // 处理每个元素 System.out.println("Processing: " + item); }}
这个方法可以处理任何类型的Collection,无论是Set<String>、List<Integer>,还是Queue<Double>。
案例2:合并两个列表假设你需要编写一个方法来合并两个列表,并且这两个列表的元素类型可以是任何Number的子类。你可以使用上界通配符来实现。
public List<Number> mergeLists(List<? extends Number> list1, List<? extends Number> list2){ List<Number> result = new ArrayList<>(); result.addAll(list1); result.addAll(list2); return result;}
这个方法可以合并List<Integer>和List<Double>,返回一个List<Number>。
案例3:向集合中添加元素假设你需要编写一个方法来向一个集合中添加多个元素,并且这个集合的元素类型可以是Integer或其父类。你可以使用下界通配符来实现。
public void addElements(List<? super Integer> list, int... elements){ for (int element : elements) { list.add(element); }}
这个方法可以向List<Integer>、List<Number>,甚至是List<Object>中添加Integer类型的元素。
Java中的通配符是泛型编程中的一把利器,它让我们能够编写更加灵活、通用的代码。通过无界通配符、上界通配符和下界通配符,我们可以轻松处理多种类型的集合,确保类型安全,并提高代码的复用性。
在实际开发中,理解并熟练使用通配符,可以让你在面对复杂的泛型问题时游刃有余。希望本文的讲解和案例能够帮助你更好地掌握Java中的通配符,提升你的编程技能。