- (本文例子适用于JDK 5.0, 学习请先安装并配置!!!)
- 我们从一个简单的例子开始:假设我们现在需要一个专用来存储字符串的List,该如何实现?呵呵,这还不简单,且看如下代码:
- public static void main(String[] args)
- {
- List strList = new ArrayList();
- strList.add("one");
- strList.add("two");
- }
- 相信很多人都有过这样写的经历,不错,这个写法确实没有错。以前我们甚至都是这么做的。但是不是说要与时俱进么?这样的写法到今天来看,却就有问题了。问题来源于我们的需求,我们需要的是一个专门用来存储字符串的List,现在请在这段程序代码后面加一句,使之变成这样:
- public static void main(String[] args)
- {
- List strList = new ArrayList();
- strList.add("one");
- strList.add("two");
- strList.add(new Integer(1));
- }
- 然后运行检查一下,可以运行!是个好消息,别高兴,问题就在于这个List能正常运行(记住:程序员要求的不是程序能运行)。回头看看,我们的需求是这个List专门用来存储字符串,但是现在,这个List竟然还可以存储一个整型数据。也许你会说,Java类库定义的不就是可以存储任意一个Object么?是的,没错,但是现在我们的需求范围变小了,只需要存储字符串。别说我是钻牛角尖,我们看一个更普遍的问题:当我们操作数据库的时候,我们经常会返回一张表的所有数据,在我们通过实体关系映射之后,我们得到的就是一系列相同类型的数据,通常我们采取的操作是用一个List来保存这一系列的数据,但是由于这些数据都具有相同的类型,因此,这个List也就成了一个保存单一对象的List了。看到这里,我想对于我这个例子的目的大家应该清楚了。
- 现在我们来讨论一下问题的解决之道,一句话来总结就是我们需要一个只能操作单一类型的List。方法就在这里,Java 5给我们提供了解决之道-----Generic,对于我们的这个例子来说,Java5的类型安全要发挥作用了。
- 现在我们回到程序清单一,打开你的开发工具,编译一下(Eclipse等工具下面不用你自己变异就可以看到),我们发现程序虽然没有错误,但是却有一个警告:
- Type safety: The method add(Object) belongs to the raw type List.
- References to generic type List should be parameterized
- 看见了么, JavaTiger给你警告了,警告的来源就是上面所说的类型安全。如果你查询一下Javadoc,你会发现List 是这样定义的 :
- Public interface List<E> extends Collection,Iterable
- 注意这个<E>,它就是JavaTiger的类型安全标志,我想,到这里可以给出在保证类型安全时我们例子中的List应该如何定义了:
- List<String> strList = new ArrayList<String>();
- 在理解这条语句之前请先记住,以后这就是List的官方写法了(^_^)。现在来看一下,在List之后我们有<String>这样的标志,在JavaTiger里面,这就是类型安全的定义方法,结合这条语句,很容易就可以看出,我们定义了一个用来存储String类型的List。来看看重新定义后的效果:
- public static void main(String[] args)
- {
- List<String> strList = new ArrayList<String>();
- strList.add("one");
- strList.add("two");
- }
- 再编译一下或者直接在Eclipse里面观察,先前的警告没有了。
- 到此,应该说我们已经掌握了类型安全的基本用法了,现在我么来个小小的改变,将List 的定义改成这样:
- List<String> strList = new ArrayList();
- 呵呵,警告又回来了。虽然我们在这里对List定义了String类型,但是我们在实例化的时候去却没有指定,因此出现了这个警告,所以记住上面讲的官方写法。
- 现在回来,让我们来验证一下这个保证了类型安全的List是不是安全的。让我们还是通过向这个list 添加一个整型数据来验证:
- public static void main(String[] args)
- {
- List<String> strList = new ArrayList<String>();
- strList.add("one");
- strList.add("two");
- strList.add( new Integer(1) );
- }
- 结果竟然出错了(这可不是警告啊!) 是不是很神奇?看一下出错的消息:
- The method add(String) in the type List is not applicable for the arguments (Integer)
- 效果很明显,这个List的add方法已经只能接受String类型的参数了,Javadoc中的add( Object obj )方法已经不能用了,现在大家都应该很满意了吧,我们的需求达到了,这个List太安全了,呵呵。想想它带来的好处,以后当我们要处理一个List中间的元素时,再也不需要这么写了:
- String str = (String) list.get( i );
- 有了类型安全,我们可以直接书写:
- String str = list.get( i );
- 也许这还不以让你来满意,但是看这样一个方法吧:
- public List<String> getStrList( List<String> list )
- {
- .....
- return XXX;
- }
- 这就是参数化类型的威力,别告诉我说你觉得这个方法没有什么特别的。
- 好了,我想我的目的应该已经达到了,大家应该明白Java5里面的类型安全是怎么回事以及如何运用了,好吧,为了让大家心里更有底,再写两行代码让大家看看:
- Map<Integer,String> myMap = new HashMap<Integer ,String>();
- Set<MyClass> set = new HashSet<MyClass>(0);
- 不用再举例了吧,这几个例子够直白了吧。
- 在本文结束的时候,让我们又回到程序清单一,先前不是有警告么?如果你是这样一个人,既不想用类型安全来消除警告,又不想要看到那个讨厌的Waining,你可以在main方法以前加上这么一句(如果你用IDE的话可以自动来完成):
- @SuppressWarnings("unchecked") 。
- 使程序变成这样:
- @SuppressWarnings("unchecked")
- public static void main(String[] args)
- {
- List strList = new ArrayList();
- strList.add("one");
- strList.add("two");
- strList.add( new Integer(1) );
- }
- 这下子我想就算你如此挑剔也应该满足了,既没有类型安全,也没有警告了。为什么?关键在于我们添加的那行语句,它也是 JavaTiger的新特性之一Annotation:至于它是怎么回事,请关注后续话题。
相关推荐
英语语法-句法
摘要:本文系统梳理了英语句法知识,重点解析了五种基本句型及其扩展结构。内容包括句子类型(陈述句、疑问句、祈使句、感叹句)、复合句构成(从句分类与连词使用)、特殊句型(倒装、强调、引语转换)等。特别强调句子成分分析技巧,指出每种句子成分可由不同词法单元充当,需掌握成分识别与划分方法。文章还提供了往期语法系列链接,形成完整的英语语法学习体系,帮助读者建立从词法到句法的系统认知框架。
Type safety: The method add(Object) belongs to the raw type ArrayList
Type safety: The method add(Object) belongs to the raw type ArrayList. References to generic type ArrayList should be parameterized Eclipse中以下代码在.add方法被调用时会出现警告(warnings) Vector v =
GPS数据处理必备:IGS精密星历下载与使用全攻略(附武汉大学/CDDIS/CODE/GFZ地址)
本文为GPS/GNSS数据处理者提供了IGS精密星历的完整下载与使用指南。详细解析了最终、快速、超快速三种精密星历产品的区别与选择策略,并手把手教学如何从武汉大学、CDDIS、CODE、GFZ四大主流数据中心高效获取数据,涵盖文件命名规则解析及自动化下载脚本,助力科研与工程应用。
匿名对象不同的jdk5新特性
jdk5新特性 1、自动装箱和拆箱 2、枚举 3、静态导入 4、可变参数 5、內省 是Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性那么,那我们可以通过getName,setName来得到其值或者设置新的值。通过getName/setName来访问name属性,这就是默认的规则。Java中提供了一套API用来访问某个属性的getter,setter方法,通
100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)
100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)
YOLOv8多传感器融合技术——毫米波雷达融合技术详解
本文介绍了YOLOv8与毫米波雷达融合技术在自动驾驶系统中的应用。毫米波雷达具有全天候工作、测距测速精准等优势,但存在分辨率低等局限。通过融合YOLOv8的视觉检测能力,可显著提升系统在恶劣环境下的感知性能。文章详细阐述了融合实现方法,包括雷达数据处理、目标投影匹配、置信度融合等关键技术,并提供了评估指标和应用场景分析。这种多传感器融合方案能有效弥补单一传感器的不足,为自动驾驶提供更可靠的环境感知能力,是实现高级别自动驾驶的重要技术支撑。
java5.0_java5.0,越来越死板的java
java5.0推出了,还号称tiger.我也兴奋的看到了我要的一些语言特征,觉得以后的开发将会方便许多。然而tiger终究是tiger,让人难以亲近。我试用了下,有很多感受:.基本数据类型和对象的自动互转这的确方便了开发是好事,不过引起了当对象为空时如何取值的争论,我倾向抛Null异常;.import static这个功能还是应该提供的,不鼓励滥用。不过我始终觉得import中的这个static太...
华为OD机试真题 新系统 2026-05-13 Python&JS语言 实现【查找能被整除的最大整数】
给定一个字符串和一个正整数,字符串由大小写字母和数字组成,要求从字符串中找出最大且能被给定正整数整除的数。
21天学会Java之(Java SE第五篇):继承、常用的关键字、封装及权限修饰符、多态
文章目录继承常用的关键字this关键字static关键字super关键字final关键字封装及权限修饰符封装的作用及其优点权限修饰符封装的使用细节多态多态的概念多态的使用要点对象的转型instanceof运算符类型自动提升及强制类型转换条件多态的例子 面向对象的三个基本特征是:封装、继承、多态 继承 继承可以使我们更容易实现类的扩展,在现实世界中比比皆是。并且继承实现了代码的重用,不用再重新发...
高质量文献综述原来这么写!借助Gemini 3 Pro+四步法,手把手教你写出有逻辑深度的综述
总结与展望先总结现状,说明前人已经做到什么地步了,再指出缺口,前人没解决什么问题、方法有什么局限等等,最后再在这个缺口的基础上,提出你的未来研究方向。当你有个复杂的研究题目,但没办法拆解出关键词,就可以让Gemini 3 Pro来辅助帮你拆解,并帮你写专业的检索式,若是找英文文献,还能帮你将中文关键词翻译成地道的专业术语。做文献笔记,可以建立文献笔记矩阵,可以用Excel建个表格,横向是文献,纵向是关键要素,包括作者/年份、研究问题/假设、理论框架/模型、研究方法/数据来源、核心结论、局限性/Gap。
uni-app开发-第3篇:uni-app 页面与路由
本文详细介绍了 uni-app 中的页面开发与路由管理。首先,页面是应用的基础单元,创建页面时需在pages目录下新建文件夹和.vue文件,页面结构由<template>、<script>和<style>三部分组成。uni-app 页面生命周期函数包括onShow、onReady、onHide和onUnload,分别用于处理页面显示、渲染完成、隐藏和卸载时的逻辑。其次,路由管理通过pages.json文件配置页面路径和样式,并提供uni.navigateTo等方法进行路由
磁力链接 结构解析 分享
磁力链接由一组参数组成,参数间的顺序没有讲究,其格式与在HTTP链接末尾的查询字符串相同。最常见的参数是"xt",是"exact topic"的缩写,通常是一个特定文件的内容散列函数值形成的URN,例如: magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C 其值是Base32编码的文件的SHA-1散列。 注意,虽然这个链接指向一个特定
Vibe coding 氛围编程:编程就像聊天一样,低代码开发时代来了?
Vibe coding:编程就像聊天一样,低代码开发时代来了!
Jav环境下shell脚本的调用
开发过程中,很多时候需要shell脚本的支持某些系统层面的命令执行,譬如生成RSA秘钥文件等,这时候往往需要从高级语言中直接调用Shell脚本,完成命令执行,本文以一个例子为线索简单介绍一下如何实现在java中对系统命令的调用 1)Process 这是一个java提供的本地进程抽象,提供了整个生命周期的进程管理方法,进程信息输入、输出、状态监测、销毁等 ...
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
java 中 Collection,Iterator,Iterable的简单了解
Collection接口: 1 public interface Collection<T> extends Iterable<T> 2 { 3 int size(); 4 boolean isEmpty(); 5 void clear(); 6 boolean contains(); 7 boolean a
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
Jav 入门篇(35)方法引用
一、方法引用 1.1 概述 Lambda表达式中,要重写的方法可以用另一个简单的方法所代替,即返回值和所需参数一致,就可以使用方法引用的来进一步简化Lambda表达式。 1.2 对象::实例方法 Consumer<String> cus = (x)-> System.out.println(x); Consumer<String> cus1 = System.out ...
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
数组插入排序算法 从大到小
/** * 数组插入排序算法 * 从大到小 * @param args * @return */ public static int[] insertSort(int[] args){ for(int i=1;i<args.length;i++){ for(int j=i;j>0;j--){ ...
Type safety: The method add(Object) belongs to the raw type List. References to generic type List<E>
1 java 报错如下 Type safety: The method add(Object) belongs to the raw type List. References to generic type List<E> should be parameterized 处理方法:List 应使用泛型 https://www.cnblogs.com/vonk/p/3824205.html
java 5.0 Type safety
Type safety: The method add(Object) belongs to the raw type List. References to generic type List should be parameterized exampleList treenode = new ArrayListtreenode.add(node); javadoc 中L
Java 警告------Type safety: The method add(Object) belongs to the raw type Vector
rowdata.add(hang); // Type safety: The method add(Object) belongs to the raw type Vector. References to generic type Vector should be parameterized // 为什么会报这个警告??? Type safety: The method add
Java注解(Tiger)
<p class="MsoNormal" style="margin-left:26.25pt;text-indent:-26.25pt;mso-list:l2 level1 lfo1;tab-stops:list 26.25pt">一. Java<span style="font-family:宋体;mso-ascii-font-family:"Times New Roman";m
深入理解Java中的泛型与类型安全
我们从泛型的基本语法开始,讲解了泛型在集合中的应用、通配符的使用、泛型方法和泛型约束等高级特性。通过这些内容,你应该能够更好地理解和应用Java中的泛型技术,编写出更加通用且类型安全的代码。在Java中,泛型使用类型擦除来实现,这意味着泛型信息在运行时会被擦除,所有的泛型参数都会被替换为它们的上界(如果没有指定上界,则为。有时,你可能需要对泛型类型进行约束,以确保它们实现了特定的接口或继承了特定的类。是一个泛型方法,它可以接受任何类型的数组,并打印出其中的元素。中的元素类型,从而实现类型安全的集合操作。
8804



被折叠的 条评论
为什么被折叠?



