Java 泛型问号

Java 泛型问号是用于表示不确定的类型的占位符。它是 Java 泛型系统中的一个重要概念,用于增强代码的可重用性和类型安全性。本文将详细介绍 Java 泛型问号的使用方法和应用场景,并提供代码示例来加深理解。

什么是 Java 泛型?

在介绍 Java 泛型问号之前,首先需要了解 Java 泛型的基本概念。Java 泛型是在 JDK 5 中引入的一项特性,它允许在编译时确定操作的类型,并提供了类型安全和代码的可重用性。

泛型的基本语法如下所示:

class Box<T> {
  private T content;

  public void setContent(T content) {
    this.content = content;
  }

  public T getContent() {
    return content;
  }
}

在上面的示例中,T 是一个类型参数,它可以在实例化 Box 类时被替换成具体的类型。通过使用泛型,我们可以实现类型安全的操作,并且不需要进行强制类型转换。

问号的使用场景

Java 泛型问号是用来表示不确定的类型的占位符,它有两种使用方式:通配符(Wildcard)和未知类型(Unknown)。下面将分别介绍这两种用法。

通配符(Wildcard)

通配符是使用 ? 来表示的,它是一种灵活的类型参数,可以用于表示未知的类型。通配符主要有三种使用方式:无限定通配符、上限通配符和下限通配符。

无限定通配符

无限定通配符表示任意类型,可以用 ? 来表示。它常用于方法的参数或返回值类型,可以接受任意类型的参数或返回任意类型的值。

下面是一个使用无限定通配符的示例:

class Box<T> {
  private T content;

  public void setContent(T content) {
    this.content = content;
  }

  public T getContent() {
    return content;
  }
}

class Main {
  public static void printContent(Box<?> box) {
    System.out.println(box.getContent());
  }

  public static void main(String[] args) {
    Box<String> stringBox = new Box<>();
    stringBox.setContent("Hello, World!");

    Box<Integer> intBox = new Box<>();
    intBox.setContent(42);

    printContent(stringBox);
    printContent(intBox);
  }
}

在上面的示例中,printContent 方法接受一个 Box<?> 参数,该参数可以接受任意类型的 Box 对象。通过使用无限定通配符,我们可以编写更加通用的代码,提高代码的可重用性。

上限通配符

上限通配符表示只接受某一类型及其子类型作为参数,可以使用 ? extends T 的形式来表示。它常用于方法的参数类型,可以接受指定类型及其子类型的参数。

下面是一个使用上限通配符的示例:

class Box<T> {
  private T content;

  public void setContent(T content) {
    this.content = content;
  }

  public T getContent() {
    return content;
  }
}

class Main {
  public static void printContent(Box<? extends Number> box) {
    System.out.println(box.getContent());
  }

  public static void main(String[] args) {
    Box<Integer> intBox = new Box<>();
    intBox.setContent(42);

    Box<Double> doubleBox = new Box<>();
    doubleBox.setContent(3.14);

    printContent(intBox);
    printContent(doubleBox);
  }
}

在上面的示例中,printContent 方法接受一个 Box<? extends Number> 参数,该参数可以接受 Number 类型及其子类型的 Box 对象。通过使用上限通配符,我们可以限定方法的参数类型,增强代码的类型安全性。

下限通配符

下限通配符表示只接受某一类型及其父类型作为参数,可以使用 ? super T 的形式来表示。它常用于方法的参数类型,可以接受指定类型及其父类型的参数。

下面是一个使用下限通配符的示例:

class Box<T> {
  private T content;

  public