Java泛型和集合之泛型介绍
在声明一个接口和类的时候可以使用尖括号带有一个或者多个参数但是当你在声明属于一个接口或者类的变量的时候或者你在创建一个类实例的时候需要提供他们的具体类型。我们来看下下面这个例子
List<String>words = new ArrayList<String>();
words.add("Hello ");
words.add("world!");
String s = words.get(0)+words.get(1);
assert s.equals("Hello world!");
在集合框架中,ArrayList<E>实现了接口List<E>,上面这个简单的代码声明了包含了多个字符串列表的变量words,并且创建了一个ArrayList实例,把两个字符串添加到这个列表中,然后把他们取出来。在Java以前的泛型中,相同的代码会这样写:
List words = new ArrayList();
words.add("Hello ");
words.add("world!");
String s = ((String)words.get(0))+((String)words.get(1))
assert s.equals("Hello world!");
如果没有泛型,参数类型会被忽略掉。但是在元素从列表中取出的时候你必须,明确的使用强制类型转换。实际上,从上面两种源文件编译后的字节码文件时完全一样的。我们说这是泛型擦除。因为List<Integer>,List<String>, and List<List<String>>等等这些类型在运行时都是相同的类型List。我们将从第一个程序到第二个程序的处理过程称为泛型擦除。术语擦除是有一点不准确,因为程序擦除了参数类型但是增加了强制转换。
泛型隐式的使用了相同的强制转换而显示的表示没有使用泛型。如果这个转换失败,那么使用泛型写的代码就很难去调试了。因为下面的前置条件说以为什么说泛型是可靠的:
通过泛型编译加入的隐式转换永远不会失败。
这个条件有很重要的一点是:对于编译器来说,它没有已发布的未检查的警告的时候这个才有效。稍后我们将在一定程度上讨论什么导致已发布的未检查的警告还有就是怎么样最小化他们的影响。通过泛型擦除实现的泛型有很多好处。它使事情变得简单,在这样的泛型中不会添加任何根本上讲新的东西;它使事情变得的小巧,准确来讲它只会有一个List的实现,而不是针对每个类型有一个版本;它擦除了过程,因为在相同的库中我们可以用泛型或者非泛型的形式去访问调用。最后一点是很值得好好的阐述的,你不会碰到令你不快的问题在你使用两种不同版本的类库时:使用1.4或者以前的遗留的非泛型版本,和一个使用版本5和6的泛型版本。在字节码层面,不适用泛型的代码和使用泛型的代码是一样的。没有必要立刻转向全部转泛成型---你可以升级你的代码通过每次只更新一个包一个类一个方式去开始使用泛型。我们甚至可以解析出你为遗留大代码声明的泛型类型。
通过泛型擦除还有另外一个影响就是数组类型和参数化的类型在使用上是不一样的。运行new String[size] 将分配一个数组并且另外在这个数组中存储String类型的组件。作为对比,运行new ArrayList<String>()分配了一个列表,但是不另外存储列表的元素类型在这个列表中。在术语中,我们说Java具体化了数组元素的类型。但是没有具体化列表的元素类型。
很难去
Java泛型和集合之泛型介绍的更多相关文章
- Java基础之集合与泛型
话不多说,直接上图 1.Collection集合小结 注意: 凡是使用哈希表保存对象的容器,保存的对象在容器中都是唯一的,唯一性是通过被保存对象的hashCode和equals方法共同确定: 凡是使用 ...
- Java泛型和集合之泛型VS模板
Java的泛型很像C++中的模板,说到Java 泛型和C++中的模板的关系时,有两个重要的方面需要被考虑到:语法和语义.语法看起来是相似的,可是语义却明显是不同的. 在语法上讲,选择尖括号 是因为他 ...
- java基础(7)集合与泛型
第一部分:Collection集合 1 collection集合概述 集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map. C ...
- JAVA基础之集合、Iterator迭代器、泛型及增强for循环
个人理解: 对于集合,首先要明确的是最顶层的接口是Collection接口类,其包含一些基本的方法以便子类调用,不过在定义的时候最好定义好数据类型,以免遍历时还得必须进行向上转型:特别注意的是其没有关 ...
- java基础(18):集合、Iterator迭代器、增强for循环、泛型
1. 集合 1.1 集合介绍 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数 ...
- Java 集合和泛型
一.集合(Collections) Java使用集合来组织和管理对象. 1.Java的集合类 集合类主要负责保存.盛装和管理对象,因此集合类也被称为容器类. 集合类分为Set.List.Map和Que ...
- Java集合之泛型的使用
Java集合之泛型的使用 泛型提供了一种轻便灵活的数据操作,数据的安全性相对提高. 泛型提供了对列表元素的约束条件,比如ArrayList有序链表,可存储任意类型的元素. 此处构建一个ArrayLis ...
- Java中泛型在集合框架中的应用
泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通 ...
- Java基础知识强化之集合框架笔记30:集合之泛型的引入
1. 泛型的引入: (1)首先我们看看下面这一段代码,如下: package cn.itcast_01; import java.util.ArrayList; import java.util.It ...
随机推荐
- spring mvc中实现csrf安全防御简记
1.csrf是什么 csrf全称是Cross-site request forgery,http://en.wikipedia.org/wiki/Csrf 危害:使受害用户在不经意间执行了不是用户意愿 ...
- Data URI(转)
Data URL 早在 1995 年就被提出,那个时候有很多个版本的 Data URL Schema 定义陆续出现在 VRML 之中,随后不久,其中的一个版本被提上了议案——将它做个一个嵌入式的资源放 ...
- Windows Cygwin Redis 安装(转)
在win平台下编译Redis一般有两种方式: 1. 基于MS VC进行编译,生成原生可执行文件 该方式需要创建MSVC项目文件以及对Redis源码进行适当调整. 这里提供一个可行版本,由微软开放团队进 ...
- 拆分字段优化SQL
拆分字段优化SQL 今天看到一条用函数处理连接的SQL,是群里某位网友的,SQL语句如下: SELECT SO_Order.fdate , SO_Order.fsn FROM so_order INN ...
- SVN常见错误两项纪录
1.svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted 也许前clean ...
- PHP第三个教训 PHP基本数据类型
学习平台: 1.php七种变量类型 2.isset和empty到这两个功能区分 3.型式试验 4.自己主动类型转换 5.类型转换 注意: 1.通过 变量->方法名 来调用. $user1 = ...
- 网络资源(7) - JAX-WS视频
2014_08_25 http://v.youku.com/v_show/id_XNjMzNDcyMTk2.html 基于JAX-WS编程模型的WebService 1. @WebService注释类 ...
- 汉字转拼音 oracle方式 [转]
oracle汉字转拼音(获得全拼/拼音首字母/拼音截取等) 效果如下: Oracle 字符集 GBK 没有问题 , UTF -8 需要修改一下 Sql代码 --oracle汉字转拼音 PA ...
- 开源搜索引擎Iveely 0.8.0
开源搜索引擎Iveely 0.8.0 这是一篇博客,不是,这是一篇开源人的心酸和喜悦,没有人可以理解我们的心情,一路的辛酸一路的艰辛,不过还好,在大家的支持下,总算是终见天日,谢谢那些给予我们无私帮助 ...
- C# Email邮件发送,功能是密码找回或者重置功能。
原文:C# Email邮件发送,功能是密码找回或者重置功能. 最近根据公司需求,写个邮件发送. 这里面的传入的地址信息的参数都是经过加密的. 主要是保证用户信息的安全. 帮助类 using ...