尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
泛型类与类型安全详解
执行上述 Java 程序清单每个清单的核心概念、代码要点及运行结果如下Listing 1: 基本泛型类概念定义了一个泛型类GenT其中T是类型参数在实例化时被具体类型如Integer、String替换。要点使用泛型后从getob()方法获取值时无需进行强制类型转换编译器会确保类型安全。运行结果Type of T is java.lang.Integer value: 88 Type of T is java.lang.String value: Generics TestListing 2: 非泛型类对比概念NonGen类使用Object类型来存储数据以模拟泛型出现前的实现方式。要点从getob()获取值后必须进行显式的强制类型转换如(Integer)、(String)。代码末尾的iOb strOb;赋值是合法的因为都是NonGen类型但会导致后续的(Integer) iOb.getob()在运行时抛出ClassCastException这凸显了非泛型代码在类型安全上的缺陷。运行结果Type of ob is java.lang.Integer value: 88 Type of ob is java.lang.String value: Non-Generics Test Exception in thread main java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at NonGenDemo.main(NonGenDemo.java:48)Listing 3: 多类型参数的泛型类概念泛型类TwoGenT, V可以声明多个类型参数。运行结果Type of T is java.lang.Integer Type of V is java.lang.String value: 88 value: Generics Listing 4: 有缺陷的泛型类编译错误概念StatsT试图计算任意类型数组的平均值但在average()方法中调用nums[i].doubleValue()会导致编译错误因为编译器无法确保类型T一定有doubleValue()方法。要点此清单旨在展示无界泛型的局限性代码本身无法通过编译。Listing 5: 有界类型参数概念通过StatsT extends Number声明了一个有界类型参数将T限制为Number或其子类如Integer、Double。这样在average()方法中就可以安全调用Number类定义的doubleValue()方法。要点被注释掉的StatsString部分将无法编译因为String不是Number的子类这体现了编译时类型检查的优势。运行结果iob average is 3.0 dob average is 3.3 Listing 6: 通配符参数概念在sameAvg(Stats? ob)方法中使用了无界通配符?表示它可以接受任何泛型类型的Stats对象作为参数。这使得方法可以比较不同类型如Integer、Double、Float的Stats对象的平均值。运行结果iob average is 3.0 dob average is 3.3 fob average is 3.0 Averages of iob and dob differ. Averages of iob and fob are the same.Listing 7: 有界通配符概念演示了有界通配符在继承层次结构中的应用。CoordsT extends TwoD是一个泛型类。方法showXY(Coords? c)使用无界通配符可接受任何Coords对象。showXYZ(Coords? extends ThreeD c)和showAll(Coords? extends FourD c)使用上界通配符分别限制参数必须是CoordsThreeD或其子类和CoordsFourD或其子类。因此showXYZ(tdlocs)和showAll(tdlocs)的调用被注释掉因为tdlocs是CoordsTwoD类型不满足? extends ThreeD的约束。运行结果Contents of tdlocs. X Y Coordinates: 0 0 7 918 41 -23Contents of fdlocs. X Y Coordinates: 1 26 8 22 93 -2 X Y Z Coordinates: 1 2 36 8 14 22 9 43 -2 -23 X Y Z T Coordinates: 1 2 3 4 6 8 14 822 9 4 9 3 -2 -23 17 Listing 8: 泛型方法概念在普通类GenMethDemo中定义了一个泛型方法isIn()。方法签名T extends ComparableT, V extends T声明了类型参数T和V其中T必须实现ComparableT接口V必须是T或其子类。这使得方法可以检查一个对象是否在特定类型的数组中。要点被注释掉的isIn(two, nums)调用会导致编译错误因为类型不兼容String不是Integer的子类反之亦然这保证了类型安全。运行结果2 is in nums7 is not in nums two is in strs seven is not in strs Listing 9: 泛型构造函数概念在非泛型类GenCons中构造函数被声明为泛型T extends Number GenCons(T arg)。这意味着构造函数可以接受任何Number或其子类的参数。运行结果val: 100.0 val: 123.5Listing 10: 泛型接口概念定义了一个泛型接口MinMaxT extends ComparableT然后由泛型类MyClassT extends ComparableT实现它。这确保了存储在MyClass中的对象类型T本身是可比较的从而能在min()和max()方法中调用compareTo()。运行结果Max value in inums: 8 Min value in inums: 2 Max value in chs: w Min value in chs: bListing 11: 原始类型概念演示了使用原始类型Gen raw会绕过泛型类型检查可能导致运行时ClassCastException。原始类型是为了兼容遗留代码在新代码中应避免使用。要点示例中展示了多个由于使用原始类型而可能引发运行时错误的赋值和强制转换这些代码行被注释掉了。运行结果value: 98.6Listing 12 13: 泛型类的继承Listing 12泛型类Gen2T继承自GenT并传递了相同的类型参数T。Listing 13泛型子类Gen2T, V扩展了父类的类型参数增加了第二个类型参数V。运行结果 (Listing 13)Value is: 99 Listing 14: 非泛型类作为泛型类的父类概念泛型类GenT可以继承自一个非泛型类NonGen。运行结果Hello 47 Listing 15: 泛型与 instanceof概念演示了在泛型类继承层次中使用instanceof运算符。由于类型擦除不能在运行时检查泛型类型的具体参数如Gen2Integer只能使用无界通配符Gen2?进行检查。运行结果iOb2 is instance of Gen2 iOb2 is instance of Gen strOb is instance of Gen2 strOb is instance of Gen iOb is instance of Gen Listing 16: 重写泛型方法概念泛型子类Gen2T可以重写从泛型父类GenT继承的泛型方法getob()。运行结果Gens getob(): 88Gen2s getob(): 99Gen2s getob(): Generics Test Listing 17: 桥方法概念当非泛型类继承一个参数化的泛型类如Gen2 extends GenString并重写其方法时编译器会生成一个合成的“桥方法”来维持多态性和类型安全。用户代码中看到的是重写的String getob()方法。运行结果You called String getob(): Generics TestListing 18: 类型擦除导致的模糊性概念由于类型擦除set(T o)和set(V o)在编译后会变成相同的原始类型签名set(Object o)导致重载模糊因此这段代码无法编译。Listing 19: 不能实例化类型参数概念不能在泛型类内部使用new T()来创建类型参数T的实例因为类型擦除后T变为Object且编译器无法知道T是否有可访问的构造函数。Listing 20: 静态上下文中的类型参数概念不能在静态变量或静态方法中使用类的类型参数T因为静态成员在类级别共享而类型参数属于实例级别。Listing 21: 泛型与数组概念不能使用new T[10]创建泛型数组因为类型擦除后数组的元素类型无法确定。可以将一个已存在数组的引用赋值给泛型数组变量如vals nums;。不能创建参数化类型数组如GenInteger[] gens new GenInteger[10];。可以创建无界通配符类型的数组如Gen?[] gens new Gen?[10];。参考来源Java 泛型(Generic) 自定义泛型类和泛型接口和泛型方法的使用、泛型通配符泛型类、泛型方法及泛型应用深入解析 Java 泛型的魅力与机制泛型类和泛型接口关于java中泛型类和泛型方法
RELATED

相关推荐

泛微·令信通统一身份管控系统应用场景介绍

泛微·令信通统一身份管控系统应用场景介绍

> 账号分散风险凸显,泛微令信通如何构建身份安全体系?> 泛微令信通统一身份管控,赋能全场景可信安全访问一、引言/背景概述随着数字经济与实体经济深度融合,组织数字化转型进入深水区,OA、ERP、CRM、HRM等业务系…

📅 2026/9/25 21:55:45
似乎没人用4*4卷积了!cifar10训练上82

似乎没人用4*4卷积了!cifar10训练上82

平时用惯了两个线性层结尾&#xff1a;layers.emplace_back(std::make_shared<Linear>(cublas, batch, 128 * 64, 500)); layers.emplace_back(std::make_shared<LeakyRL>(cudnn, batch, 500, 1, 1));layers.emplace_back(std::make_shared<Linear>(cubla…

📅 2026/8/22 17:25:21
WebQQWeChat开源项目:基于Web协议实现QQ微信统一管理与自动化

WebQQWeChat开源项目:基于Web协议实现QQ微信统一管理与自动化

1. 项目概述与核心价值如果你还在为同时管理QQ和微信的多个账号、频繁切换客户端、或者想实现一些自动化操作&#xff08;比如定时发送消息、自动回复、消息聚合&#xff09;而头疼&#xff0c;那么WebQQWeChat这个开源项目&#xff0c;绝对值得你花时间研究一下。我最初接触它…

📅 2026/8/22 17:25:22
MORE NEWS

更多资讯

📰

大模型产品负责人的真实压力与破局路径

我无法根据您提供的输入内容生成符合要求的博文。原因如下&#xff1a;项目标题“Qwen新1号位首次亮相&#xff0c;刘大一恒能否顶住压力&#xff1f;”属于人物动态类媒体话题&#xff0c;明显指向某次公开活动、组织任命或行业报道中的角色更替事件&#xff1b;但项目正文为空…

📰

未来十年就业率高的四大专业方向:AI、医疗、新能源与智能制造

每年填报季还没到&#xff0c;我就开始收到朋友和读者家长的消息&#xff0c;问的基本都是同一句话&#xff1a;哪个专业以后好找工作&#xff0c;你给个准话。这类问题我一般不会一上来就报专业名字&#xff0c;而是会先反问三个问题&#xff1a;孩子数学和物理能扛到什么程度…

📰

BP-Adaboost:用BP神经网络作为弱学习器的集成方法

简介&#xff1a;本资源是一个基于C#实现的BP-AdaBoost集成学习算法项目&#xff0c;面向机器学习初学者与Windows平台开发者&#xff0c;聚焦于强分类器构建与预测任务&#xff0c;特别适用于皮肤病变等二分类场景的建模实践。压缩包共46个文件&#xff0c;包含7个C源码&#…

📰

Java核心基础拆解:从JDK配置到高频面试题的系统学习路线

1. 把Java核心基础拆开看&#xff1a;它在学什么&#xff0c;为什么面试总绕不开先说个我观察到的现象&#xff1a;只要你在搜索引擎里敲下“Java”三个字&#xff0c;下拉联想永远是“Java基础”“Java面试题”“Java学习路线”“Java八股文”这几个词轮番出现。这说明什么&am…

📰

人才盘点岗位能力拆解:数据分析、九宫格模型和Excel的优先级怎么排

截至2026年9月秋招季&#xff0c;人才盘点岗位对校招生的硬性能力门槛是Excel数据处理加对九宫格、360评估等方法论的基本理解&#xff0c;数据分析能力是面试中区分度最高的考察项&#xff0c;直接问工具操作细节的面试题正在增多。 智联招聘2026年9月发布的一份组织发展管培生…

📰

旅游社交小程序源码实战:从部署排错到答辩改造的毕业设计指南

简介&#xff1a;这是一份面向计算机相关专业毕业设计的旅游社交小程序完整源码&#xff0c;基于Java后端与Vue前端技术栈&#xff0c;涵盖用户社交、景点推荐、游记发布等典型模块&#xff0c;经导师指导并获98分评价&#xff0c;适合需要项目实战练习或完成课程设计的学生参考…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬