java 中的通配符泛型允许使用通配符来表示未知类型,有上限(? extends type)和下限(? super type)两种通配符:上限通配符表示通配符类型扩展自给定类型,限制泛型类型只能是给定类型的子类或本身。下限通配符表示通配符类型是给定类型的超类或本身,限制泛型类型只能是给定类型的父类或本身。
Java 中的通配符泛型
通配符泛型为 Java 泛型提供了使用通配符来表示未知类型的功能。它补充了对特定类型参数化的限制,允许编写更通用的代码。
上限和下限通配符
立即学习“Java免费学习笔记(深入)”;
有两种通配符:上限和下限。
上限通配符(? extends Type):表示通配符类型扩展自给定类型。它限制了泛型类型只能是给定类型的子类或其本身。
下限通配符(? super Type):表示通配符类型是给定类型的超类或其本身。它限制了泛型类型只能是给定类型的父类或其本身。
语法
要使用通配符泛型,请在泛型声明中使用通配符符号(?),后跟可选的上限或下限界限:
<T extends Type> // 上限通配符 <T super Type> // 下限通配符
实战案例
考虑一个比较两个列表元素的比较器:
public class Comparator<T> { public int compare(T o1, T o2) { if (o1 == null || o2 == null) { return o1 == null ? o2 == null ? 0 : -1 : 1; } return o1.compareTo(o2); } }
此比较器适用于任何实现了 Comparable 接口的类,但假设我们希望使用一个未知类型的单个比较器来比较不同的列表。我们可以使用上限通配符:
public class GenericComparator<? extends Comparable<T>> { public int compare(T o1, T o2) { if (o1 == null || o2 == null) { return o1 == null ? o2 == null ? 0 : -1 : 1; } return o1.compareTo(o2); } }
现在,这个比较器可以与任何类型(只要它是 Comparable)一起用于列表比较:
List<Integer> list1 = Arrays.asList(1, 2, 3); List<String> list2 = Arrays.asList("a", "b", "c"); GenericComparator<Comparable> comparator = new GenericComparator<>(); System.out.println(comparator.compare(list1.get(0), list2.get(0))); // -1
以上就是Java 中的通配符泛型是什么?的详细内容,更多请关注图灵教育其它相关文章!