返回

透视Java中的无界通配符:剖析问号?

Android

在Java语言中,无界通配符<?>是一个非常有用的工具,它可以让你在不指定具体类型的情况下使用泛型。这使得代码更加灵活和通用,也更易于维护。在本文中,我们将深入探究Java中的无界通配符,了解它在什么时候使用,以及如何使用它来编写更强大、更健壮的代码。

无界通配符的本质

无界通配符<?>本质上是一个不指定任何类型的通配符。这意味着它可以匹配任何类型的值。例如,以下代码定义了一个可以接受任何类型值的列表:

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

你可以向这个列表中添加任何类型的值,而不会出现编译错误。例如,以下代码向列表中添加了一个字符串、一个整数和一个布尔值:

list.add("Hello");
list.add(123);
list.add(true);

无界通配符的用途

无界通配符在Java中有很多用途。以下是一些常见的用途:

  • 作为方法参数类型: 无界通配符可以作为方法参数类型,这允许方法接受任何类型的值。例如,以下方法可以接受任何类型值的列表作为参数:
void printList(List<?> list) {
  for (Object item : list) {
    System.out.println(item);
  }
}
  • 作为方法返回值类型: 无界通配符可以作为方法返回值类型,这允许方法返回任何类型的值。例如,以下方法返回一个包含任何类型值列表的列表:
List<List<?>> getLists() {
  List<List<?>> lists = new ArrayList<>();
  lists.add(Arrays.asList("Hello", "World"));
  lists.add(Arrays.asList(1, 2, 3));
  lists.add(Arrays.asList(true, false, true));
  return lists;
}
  • 作为泛型类型参数: 无界通配符可以作为泛型类型参数,这允许你创建可以处理任何类型值的泛型类或接口。例如,以下类定义了一个可以存储任何类型值的列表:
class MyList<T> {
  private List<T> list;

  public MyList() {
    list = new ArrayList<>();
  }

  public void add(T item) {
    list.add(item);
  }

  public T get(int index) {
    return list.get(index);
  }

  public int size() {
    return list.size();
  }
}

无界通配符的局限性

无界通配符虽然非常有用,但它也有一些局限性。以下是一些无界通配符的局限性:

  • 无法使用类型参数: 因为无界通配符不指定任何类型,所以你无法使用类型参数来访问无界通配符类型的值。例如,以下代码将引发编译错误:
List<?> list = new ArrayList<>();
String item = list.get(0); // Compile-time error
  • 无法修改列表中的值: 因为无界通配符不指定任何类型,所以你无法修改列表中的值。例如,以下代码将引发编译错误:
List<?> list = new ArrayList<>();
list.set(0, "Hello"); // Compile-time error

结语

无界通配符是Java语言中一个非常有用的工具,它可以让你在不指定具体类型的情况下使用泛型。这使得代码更加灵活和通用,也更易于维护。然而,无界通配符也有一些局限性,你需要了解这些局限性,以便在使用无界通配符时避免出现错误。