Java泛型:上界与下界通配符详解

需积分: 0 0 下载量 157 浏览量 更新于2024-08-04 收藏 63KB DOCX 举报
"Java泛型中的通配符与边界概念解析" 在Java编程中,泛型是一种强大的工具,它允许我们在类、接口和方法中使用类型参数,以增强代码的类型安全性和重用性。然而,当涉及到不同泛型类型的转换时,可能会遇到一些限制。为了克服这些限制,Java引入了通配符(Wildcards)和边界(Bounds),其中<? extends T>被称为上界通配符,而<? super T>被称为下界通配符。 1. 为什么需要通配符和边界? 通配符和边界的主要目的是放宽Java编译器对泛型类型的严格限制,特别是在处理继承关系时。例如,一个`Fruit`类和它的子类`Apple`,当我们想创建一个能存储任何水果类型的`Plate`容器时,直接使用`Plate<Fruit>`会限制其只能存储`Fruit`对象。如果试图将`Apple`对象放入`Plate<Fruit>`,编译器会报错,因为`Plate<Apple>`不能被视作`Plate<Fruit>`。通过使用通配符,我们可以指定一个更宽松的类型限制,使得不同泛型间的转换变得可能。 2. 什么是上界? 上界通配符`<? extends T>`表示可以接受任何类型T或其子类的对象。在上述例子中,`Plate<? extends Fruit>`意味着这是一个可以存放任何`Fruit`或其子类对象的盘子,包括`Apple`。因此,我们可以说`Plate<Apple>`是`Plate<? extends Fruit>`的一个实例,这允许我们将`Plate<Apple>`赋值给`Plate<? extends Fruit>`类型的变量,解决了上述的编译错误。 3. 什么是下界? 下界通配符`<? super T>`则相反,它表示可以接受类型T或其父类的对象。如果我们有一个需要处理任意类型`Fruit`的方法,比如`eat(Fruit f)`,并希望传入一个`Apple`对象,使用`<? super Fruit>`可以帮助我们。例如,`eat(Plate<? super Fruit>)`就可以接收`Plate<Fruit>`或`Plate<Apple>`,因为`Fruit`和`Apple`都是`Fruit`的实例。 4. PECS原则 PECS(Producer Extends, Consumer Super)原则是处理泛型和通配符的一种指导方针。"Producer Extends"意味着当你从一个容器中取出元素时(消费者角色),应该使用`? extends`,因为它只关心取出的元素是某个类型或其子类。"Consumer Super"则表示当你向一个容器中添加元素时(生产者角色),应该使用`? super`,因为它关心的是能否接受所有类型或其父类。 总结来说,Java的泛型通配符和边界提供了一种灵活的方式来处理类型兼容性问题,使得我们可以更有效地利用继承关系,同时保持代码的类型安全性。理解并熟练运用PECS原则有助于编写出更加高效和可维护的代码。

"/pkg/qct/software/llvm/release/arm/14.0.0/bin/clang" -g -Os -fshort-wchar -fno-strict-aliasing -Wall -Werror -Wno-array-bounds -c -include AutoGen.h -mlittle-endian -fno-short-enums -save-temps -fverbose-asm -funsigned-char -ffunction-sections -fdata-sections -fno-builtin -Wno-address -fno-asynchronous-unwind-tables -target aarch64-linux-gnu -fcolor-diagnostics -fdiagnostics-format=vi -Wno-parentheses-equality -Wno-tautological-compare -Wno-tautological-constant-out-of-range-compare -Wno-empty-body -Wno-unknown-warning-option -Wno-unused-function -Wno-bitwise-op-parentheses -mcmodel=small -ffixed-x18 -mstrict-align -fstack-protector -Wno-nonportable-include-path -Wno-misleading-indentation -fno-common -mtune=cortex-a53 -I/home/chen-docker/bin/boot/boot_images/BuildLogs/QcomPkg/SocPkg/LeMans/AU/Include -include /home/chen-docker/bin/boot/boot_images/boot/QcomPkg/Include/Library/DebugLib.h -DQCOM_EDK2_PATCH -DDISABLE_DEP -DENABLE_XN -DENABLE_ASLR -DENABLE_DEP_64 -DENABLE_EXEC_CODE_READY_TO_BOOT -DENABLE_AUTO_PLAT -DMAX_DDR_REGIONS=6 -mstrict-align -mcpu=cortex-a53 -DPRODMODE -c -o /home/chen-docker/bin/boot/boot_images/Build/LeMansAU/Core/RELEASE_CLANG140LINUX/AARCH64/MdeModulePkg/Library/UefiHiiLib/UefiHiiLib/OUTPUT/./HiiLib.obj @/home/chen-docker/bin/boot/boot_images/Build/LeMansAU/Core/RELEASE_CLANG140LINUX/AARCH64/MdeModulePkg/Library/UefiHiiLib/UefiHiiLib/OUTPUT/inc.lst /home/chen-docker/bin/boot/boot_images/edk2/MdeModulePkg/Library/UefiHiiLib/HiiLib.c /pkg/qct/software/llvm/release/arm/14.0.0/bin/clang: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory GNUmakefile:373: recipe for target '/home/chen-docker/bin/boot/boot_images/Build/LeMansAU/Core/RELEASE_CLANG140LINUX/AARCH64/MdeModulePkg/Library/UefiHiiLib/UefiHiiLib/OUTPUT/HiiLib.obj' failed Building ... /home/chen-docker/bin/boot/boot_images/edk2/MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf [AARCH64] make: *** [/home/chen-docker/bin/boot/boot_images/Build/LeMansAU/Core/RELEASE_CLANG140LINUX/AARCH64/MdeModulePkg/Library/UefiHiiLib/UefiHiiLib/OUTPUT/HiiLib.obj] Error 127 make: Nothing to be done for 'tbuild'. build.py... : error 7000: Failed to execute command make tbuild [/home/chen-docker/bin/boot/boot_images/Build/LeMansAU/Core/RELEASE_CLANG140LINUX/AARCH64/MdeModulePkg/Library/UefiHiiLib/UefiHiiLib]错误在哪里?

2023-07-20 上传