Java 中的上界通配符

2024 年 9 月 10 日 | 阅读 3 分钟

Java 的泛型提供了一种强大的方式来创建类、接口和方法,这些类、接口和方法可以在保持类型安全的同时处理各种类型。通配符在泛型中的应用进一步增加了其通用性,使您能够设计更灵活、可重用的代码。上界通配符就是这样一种通配符。在本节中,我们将解释上界通配符,阐述它们在 Java 中的用途,并解释它们的优点。

Java 通配符

通配符是泛型编程中的一个特殊字符,用问号 (?) 表示。通配符代表未知类型。在 Java 泛型中,有三种不同类型的通配符:?、? extends T 和? super T。

上界通配符

通过使用上界通配符,您可以指示任何作为特定类型子类型的类型都可以成为参数化类型(例如接口或泛型类)。换句话说,它通过允许使用基类型及其所有子类来提供一定程度的通用性。

上界通配符的基本语法如下:

在此示例中,T 可以是 SomeType 的任何子类。

方法参数中的通配符

我们还可以使用上界通配符作为方法参数,以实现更大的灵活性。例如:

此示例中的 process 方法接受一个带有上界通配符 (<T extends Number>) 的 Box 作为参数。这意味着它可以接受包含任何 Number 子类型的 Box。

上界通配符的用途

1. 提高灵活性

使用上界通配符的主要原因之一是提高代码的灵活性。当我们使用特定类型作为参数时,我们会限制可使用类型的范围。通过使用上界通配符,我们允许更广泛的类型,使我们的代码更通用。

2. 子类型多态

上界通配符促进子类型多态,允许我们编写与基类型及其所有派生类型无缝工作的代码。这在处理类层次结构和多态行为时特别有用。

上界通配符的局限性

虽然上界通配符提供了灵活性,但也有其局限性。其中一个限制是,我们无法写入用上界通配符声明的泛型类型。这被称为协变。例如:

尝试为带有上界通配符的 Box 设置值会导致编译错误。这是因为编译器无法保证通配符的实际类型,并且它希望确保类型安全。

现在,让我们看一个使用泛型方法处理元素列表的实际示例。假设我们有一个输出列表元素的方法:

WildCards.java

输出

1 2 3 4 5 
1.1 2.2 3.3 4.4 5.5

解释

此示例中的 printList 方法通过使用上界通配符 (<T extends Number>) 指定列表可以包含任何 Number 子类型的组件。这样就不需要单独的方法,并且允许我们传递 Double 和 Integer 的列表。

结论

Java 的上界通配符提供了一个强大的工具,用于创建更可重用、更灵活的代码。通过允许参数化类型成为给定类型的任何子类型,我们可以创建与各种类型完美配合的类和方法。这增强了代码的多态性,并鼓励代码重用。

总之,了解如何在 Java 中使用上界通配符将帮助我们为应用程序编写更灵活、更具韧性和更通用的代码。


下一个主题Java 中的通配符