了解Java仿制药和通配符
Java Generics通过允许在类,接口和方法上允许类型参数来提供编译时类型的安全性并消除铸造;通配符(?,?扩展类型,?super类型)操作灵活性的未知类型。 1。使用无界通配符类型无关紧要,并且只需要读取为对象。 2。使用上限通配符用于您阅读项目的生产者方案(例如,数字总和)。 3。使用较低的通配符对于添加项目的消费者方案(例如,将整数添加到列表中)。请记住PECS规则:生产者扩展,消费者超级。仿制药使用类型擦除,因此类型信息在运行时不可用,可以防止对通用类型,运行时检查或参数化类型的数组进行实例化。避免原始类型和不必要的通配符返回类型。了解这些原则可以提高Java收集和API中的代码安全性和表现力。
Java Generics和通配符是强大的功能,可以在推广代码重复使用的同时启用类型安全的编程。它们是在Java 5中引入的,以允许类,接口和方法在各种类型的对象上操作,同时在编译时捕获类型错误。但是,他们的语法和行为(尤其是通配符)一开始会混淆。让我们以实用的方式将它们分解。

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

List <string> names = new ArrayList <>(); names.Add(“ Alice”); 字符串名称= names.get(0); //无需铸造
没有仿制药,您将不得不铸造:
列表名称= new ArrayList(); names.Add(“ Alice”); 字符串名称=(string)名称。get(0); // ClassCastException的风险
仿制药消除了铸造的需求并提供编译时类型的安全性。

通配符:处理未知类型
有时,您不知道您正在使用的通用集合的确切类型,但是您仍然想安全地操作它。那是通配符( ?
)进来的地方。
有三种通配符:
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>
) - 它们击败了仿制药的目的。 - 请小心混合通配符和通用方法 - 有时通用方法更清晰。
概括
- 仿制药提供编译时类型的安全性并消除铸造。
- 当确切的类型未知时,通配符(
?
,extends
,super
)可以操纵灵活性。 - 记住pecs :在获得时使用时使用
extends
,放置时super
。 - 类型擦除限制了某些用途,但可以使兼容性保持向后兼容。
了解这些概念使使用收藏,流和API的工作更加安全,更具表现力。一旦您内化了PEC和通配符规则,它们就会成为第二天性。
以上是了解Java仿制药和通配符的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

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

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

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

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

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

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

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

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

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

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

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