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