目录
什么是Java仿制药?
通配符:处理未知类型
1。无限的通配符(
2。上限通配符(
3。较低的通配符(
PECS规则:生产者扩展,消费者超级
类型擦除和限制
常见的陷阱
概括
首页 Java java教程 了解Java仿制药和通配符

了解Java仿制药和通配符

Sep 20, 2025 am 01:58 AM
java 编程

Java Generics通过允许在类,接口和方法上允许类型参数来提供编译时类型的安全性并消除铸造;通配符(?,?扩展类型,?super类型)操作灵活性的未知类型。 1。使用无界通配符类型无关紧要,并且只需要读取为对象。 2。使用上限通配符用于您阅读项目的生产者方案(例如,数字总和)。 3。使用较低的通配符对于添加项目的消费者方案(例如,将整数添加到列表中)。请记住PECS规则:生产者扩展,消费者超级。仿制药使用类型擦除,因此类型信息在运行时不可用,可以防止对通用类型,运行时检查或参数化类型的数组进行实例化。避免原始类型和不必要的通配符返回类型。了解这些原则可以提高Java收集和API中的代码安全性和表现力。

了解Java仿制药和通配符

Java Generics和通配符是强大的功能,可以在推广代码重复使用的同时启用类型安全的编程。它们是在Java 5中引入的,以允许类,接口和方法在各种类型的对象上操作,同时在编译时捕获类型错误。但是,他们的语法和行为(尤其是通配符)一开始会混淆。让我们以实用的方式将它们分解。

了解Java仿制药和通配符

什么是Java仿制药?

仿制药可让您定义具有类型参数的类,接口和方法。您可以指定集合(或任何通用类型)所包含的对象,而不是使用Object和铸造。

例子:

了解Java仿制药和通配符
 List <string> names = new ArrayList <>();
names.Add(“ Alice”);
字符串名称= names.get(0); //无需铸造

没有仿制药,您将不得不铸造:

列表名称= new ArrayList();
names.Add(“ Alice”);
字符串名称=(string)名称。get(0); // ClassCastException的风险

仿制药消除了铸造的需求并提供编译时类型的安全性。

了解Java仿制药和通配符

通配符:处理未知类型

有时,您不知道您正在使用的通用集合的确切类型,但是您仍然想安全地操作它。那是通配符? )进来的地方。

有三种通配符:

1。无限的通配符( <?>

当您不需要知道或关心类型时使用。

 public void printlist(list <?> list){
    对于(对象项目:列表){
        system.out.println(item);
    }
}

您可以将元素Object ,但是由于实际类型未知,因此不能添加任何元素( null )。

✅安全: list.get(0)
❌不允许: list.add("hello")

2。上限通配符( <? extends Type>

当您想接受类型或任何子类型时使用。在“生产者”场景中常见(您从收藏中阅读)。

 public double sum(list <?扩展数字>数字){
    返回numbers.stream()
                  .maptodouble(number ::双重值)
                  。和();
}

此方法接受List<Integer>List<Double>等,因为两者都扩展了Number

但是再次:您可以读取Number ,但不能添加任何对象(除非null ) - 因为您不知道确切的类型。

✅作品: sum(intList) intList属于List<Integer>
❌不能做: numbers.add(new Integer(5))

3。较低的通配符( <? super Type>

当您想接受一种类型或任何超级型时使用。在“消费者”场景中常见(您写入集合)。

 public void addnumbers(list <?super Integer> list){
    list.add(1);
    list.Add(2);
}

这接受List<Integer>List<Number>List<Object>

您可以添加Integer数值,但是当您阅读时,您只知道它们是Object

✅可以添加: list.add(42)
⚠️读取给出: Object obj = list.get(0);


PECS规则:生产者扩展,消费者超级

有效Java的助记符可帮助您确定要使用哪种通配符:

  • extends →列表是生产者(您从中获得/提取物品)
  • super →列表是消费者(您将/添加/添加项目)

例子:

 public static <t> void copy(list <?super t> dest,list <?扩展t> src){
    for(t项目:src){
        dest.add(item);
    }
}
  • src产生T →使用? extends T
  • dest消耗T →使用? super T

这正是设计Collections.copy()方式。


类型擦除和限制

重要的是要记住,Java中的仿制药使用类型擦除- 在运行时删除了型信息。这意味着:

  • 您无法实例化通用类型: new T()
  • 基于通用类型的没有运行时检查: list instanceof List<string></string>是非法的
  • 无法创建参数化类型的数组: new List<string>[10]</string>

之所以存在这些限制,是因为JVM在运行时只看到原始类型。


常见的陷阱

  • 不要不必要地使用通配符作为返回类型。主要在方法参数中使用它们。
  • 避免原始类型(例如List而不是List<string></string> ) - 它们击败了仿制药的目的。
  • 请小心混合通配符和通用方法 - 有时通用方法更清晰。

概括

  • 仿制药提供编译时类型的安全性并消除铸造。
  • 当确切的类型未知时,通配符( ?extendssuper )可以操纵灵活性。
  • 记住pecs :在获得时使用时使用extends ,放置时super
  • 类型擦除限制了某些用途,但可以使兼容性保持向后兼容。

了解这些概念使使用收藏,流和API的工作更加安全,更具表现力。一旦您内化了PEC和通配符规则,它们就会成为第二天性。

以上是了解Java仿制药和通配符的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Stock Market GPT

Stock Market GPT

人工智能驱动投资研究,做出更明智的决策

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

如何在Java中的类Path中添加JAR文件? 如何在Java中的类Path中添加JAR文件? Sep 21, 2025 am 05:09 AM

使用-cp参数可将JAR加入类路径,使JVM能加载其内类与资源,如java-cplibrary.jarcom.example.Main,支持多JAR用分号或冒号分隔,也可通过CLASSPATH环境变量或MANIFEST.MF配置。

文件夹在哪里找 文件夹在哪里找 Sep 20, 2025 am 07:57 AM

最直接的方法是回忆保存位置,通常在桌面、文档、下载等文件夹;若找不到,可使用系统搜索功能。文件“失踪”多因保存路径未留意、名称记忆偏差、文件被隐藏或云同步问题。高效管理建议:按项目、时间、类型分类,善用快速访问,定期清理归档,并规范命名。Windows通过文件资源管理器和任务栏搜索查找,macOS则依赖访达和聚焦搜索(Spotlight),后者更智能高效。掌握工具并养成良好习惯是关键。

如何在Java中创建文件 如何在Java中创建文件 Sep 21, 2025 am 03:54 AM

UseFile.createNewFile()tocreateafileonlyifitdoesn’texist,avoidingoverwriting;2.PreferFiles.createFile()fromNIO.2formodern,safefilecreationthatfailsifthefileexists;3.UseFileWriterorPrintWriterwhencreatingandimmediatelywritingcontent,withFileWriterover

Google Chrome无法加载此页面 Google Chrome无法加载此页面 Sep 20, 2025 am 03:51 AM

首先检查网络连接是否正常,若其他网站也无法打开则问题在网络;1.清除浏览器缓存和Cookies,进入Chrome设置选择清除浏览数据;2.关闭扩展程序,可通过无痕模式测试是否因插件冲突导致;3.检查并关闭代理或VPN设置,避免网络连接被拦截;4.重置Chrome网络设置,恢复默认配置;5.更新或重装Chrome至最新版本以解决兼容性问题;6.使用其他浏览器对比测试,确认问题是否仅限Chrome;根据错误提示如ERR_CONNECTION_TIMED_OUT或ERR_SSL_PROTOCOL_ER

了解Java仿制药和通配符 了解Java仿制药和通配符 Sep 20, 2025 am 01:58 AM

Javagenericsprovidecompile-timetypesafetyandeliminatecastingbyallowingtypeparametersonclasses,interfaces,andmethods;wildcards(?,?extendsType,?superType)handleunknowntypeswithflexibility.1.UseunboundedwildcardwhentypeisirrelevantandonlyreadingasObject

UC浏览器如何强制缩放网页_UC浏览器网页强制缩放功能使用技巧 UC浏览器如何强制缩放网页_UC浏览器网页强制缩放功能使用技巧 Sep 24, 2025 pm 04:54 PM

首先启用UC浏览器内置缩放功能,进入设置→浏览设置→字体与排版或页面缩放,选择预设比例或自定义百分比;其次可通过双指张开或捏合手势强制调整页面显示大小;对于限制缩放的网页,可请求桌面版网站以解除限制;高级用户还可通过在地址栏执行JavaScript代码修改viewport属性,实现更灵活的强制缩放效果。

为什么实时系统需要确定性响应保障? 为什么实时系统需要确定性响应保障? Sep 22, 2025 pm 04:03 PM

实时系统需确定性响应,因正确性依赖结果交付时间;硬实时系统要求严格截止期限,错过将致灾难,软实时则允许偶尔延迟;非确定性因素如调度、中断、缓存、内存管理等影响时序;构建方案包括选用RTOS、WCET分析、资源管理、硬件优化及严格测试。

如何在Java中获取通话方法的名称? 如何在Java中获取通话方法的名称? Sep 24, 2025 am 06:41 AM

答案是使用Thread.currentThread().getStackTrace()获取调用方法名,通过索引2得到调用anotherMethod的someMethod名称,因索引0为getStackTrace、1为当前方法、2为调用者,示例输出“Calledbymethod:someMethod”,也可用Throwable实现,但需注意性能、混淆、安全及内联影响。

See all articles