java part part,java泛型指导手册(part1),指导手册part1
java泛型指导手册(part1),指导手册part1
index
1.大致了解一下
从java5开始,泛型就被加入了java。泛型的意义在于:在你操作object之前,提供了一种指定特定类型为更加通用目的的类或方法的手段。听起来很抽象吧?来点例子看看。
注:泛型当然可以用在不是collection的其他类上,但是呢,用collection来展示泛型的基本概念是很好的。
泛型的例子
List这个接口代表一列表object实例,这意味着我们可以在List里放任何Object,比如:
List list = new ArrayList();
list.add(new Integer(2));
list.add("a String");
因为任何object都可能被加入进来,所以你不得不进行类型转换。比如:
Integer integer = (Integer) list.get(0);
String string = (String) list.get(1);
很经常的一个情况是,你在一个List里仅添加一种类型数据进去,比如String或其他东西,而不是像我在上面做的一样,把integer和String混在一起。
于是,你使用泛型这一特性,可以限制放在List里的object。除此之外,你省去了类型转换的烦恼。看一下用泛型的真正例子:
List strings = new ArrayList();
strings.add("a String");
String aString = strings.get(0);
牛逼吧?
java7里的类型猜测
泛型特性在java7里做了升级。从7开始,java编译器可以从你赋值给的那个变量的信息知道collection的类型,这里是java7里的泛型例子:
List strings = new ArrayList<>();
注意看,ArrayList的泛型类型已经被省略了,仅有<>留了下来。有时候,这东西也叫做菱形操作符。当你写一个菱形操作符作为一个泛型类型,java的编译器会假设这个被初始化的类和它赋值给的那个变量(i.e.左边的变量)有相同的类型。在上面的例子,String就是泛型的类型,应为List变量把String设置为了它的类型。
循环里的泛型
java5有一个新的for循环,叫做for-each, 这东西对于制定泛型的collection处理的很好。来个例子:
List strings = new ArrayList();
//... add String instances to the strings list...
for(String aString : strings){
System.out.println(aString);
}
这个for-each循环迭代在strings列表里的所有String实例。
每次迭代,下一个String实例就赋值给aString变量。这个for-loop循环比原来的while循环更加精小,在while里你不得不迭代地使用collection的迭代器(Iterator)的Iterator.next()方法去获得下个实例,这导致代码臃肿。
泛型之于非collection的其他类型
你当然可以将泛型用于其他class,而非仅仅是collection。你可以将你自己的class泛型化。这个以后再说细节。
2. java中的泛型List(Generic List in Java)
java的List接口(java.util.List)能够被泛型化。这就是说,List的一个实例能够被给定一个类型,所以只有那种类型的实例能插入List中和从List中被读取,这里就是一个例子:
List list = new ArrayList;
这个list现在仅仅和String类型的实例联系,这意味着你只能把String放进这个list。不要放别的进list,编译器会抱怨。
泛型的类型检查,仅仅在编译期检查。在运行时你可以调整代码,使字符串列表具有字符串插入的其他对象。不过这是个坏主意。(At runtime it is possible to tweak your code so that a String List has other objects that String’s inserted. This is a bad idea, though.)
进入一个泛型的列表
如下,你能get和insert泛型list的元素:
List list = new ArrayList;
String string1 = "a string";
list.add(string1);
String string2 = list.get(0);
注意,没必要对List.get()方法中得到的对象进行转型,虽然平常需要。
编译器已经知道这个List只包含String的实例,所以转型(cast)是没有必要的。
在泛型化的列表中的迭代
你可以使用迭代器迭代泛型列表,如下所示:
List list = new ArrayList;
Iterator iterator = list.iterator();
while(iterator.hasNext()){
String aString = iterator.next();
}
跟上面的进入一个泛型的列表里一样,不必转型,在while的跌代器里,你也不必转型。
你也可以使用新的for-loop,如下:
List list = new ArrayList;
for(String aString : list) {
System.out.println(aString);
}
注意,现在有一个String对象,aString,在for-loop的括号里被声明。
每一次的迭代,这个aString都获得了list的当前元素。
3. Java中的泛型集合(Generic Set in Java)
Java的Set接口(java.util.Set)可以被泛型化。也就是说,Set的实例能够被给定一个类型,所以仅有那种类型的实例能在Set中插入,读取。例子如下:
Set set = new HashSet;
这个集合现在仅仅与String类型联系起来了,意味着,只有String类型的实例能够放入这个set里,不要放别的进set,编译器会抱怨。
泛型的类型检查,仅仅在编译期检查。在运行时你可以调整代码,使字符串集合(Set)具有字符串插入的其他对象。不过这是个坏主意。(At runtime it is possible to tweak your code so that a String Set has other objects that String’s inserted. This is a bad idea, though.)
为泛型化的集合添加元素
通常使用add(),一如你平常也常用的
Set set = new HashSet;
String string1 = "a string";
set.add(string1);
那么最大的差别是什么呢?好吧,就是你尝试添加非String的实例进入上述Set,编译器会抱怨。这是个很好的额外的类型检查特性,你值得拥有。
迭代一个泛型化的Set
使用一个iterator(迭代器)吧,如下:
Set set = new HashSet;
Iterator iterator = set.iterator();
while(iterator.hasNext()){
String aString = iterator.next();
}
请注意,就像之前在List那一节所说一样,不必为interator.next()去转型。
因为Set已经被泛型化了(泛型化的意思是有了一个指定的type),编译器知道为你打理一切,不论你使用iterator还是for-loop.
下面就为你展示使用for-loop:
Set set = new HashSet;
for(String aString : set) {
System.out.println(aString);
}
4. java中的泛型Map(Generic Map in Java)
Map这个接口(java.util.Map)也是能够被泛型化的,这就是说,在一个泛型化的Map中,你可以指定为key-value指定特定的类型,这里是例子:
Map set = new HashMap;
这个Map实例set,现在只能接受Integer作为keys,接受String作为values
一样地,泛型的类型检查仅仅发生在编译期。你可以在运行期调整你的代码,这样你的其他实例就能插入了(我翻译时这段话总是不太确定,是能够动态改变key-value对应的原来的Integer-String类型吗?)。尽管这是一个坏主意。
进入(读取)一个泛型化的Map
添加和获得一个泛型化的Map的元素,一如往常,你可以使用put(),get()
Map map = new HashMap;
Integer key1 = new Integer(123);
String value1 = "value 1";
map.put(key1, value1);
String value1_1 = map.get(key1);
所以大的改变在哪呢?(作者应该是在将新的java7特性羞辱旧版java4,我说可能啊)。
在于一个很nice的类型检查:对于上诉例子,当你的key-value对不是Integer-String时,编译器会抱怨。
java5的auto boxing特性能给我们带来很大方便(使得我们的代码叙述更加人性化):
Map map = new HashMap;
Integer key1 = 123;
String value1 = "value 1";
map.put(key1, value1);
//or
map.put(123, value1);
String value1_1 = map.get(123);
迭代一个泛型化的Map
一个Map,有两个collection可以被迭代: key Set 和 value Set。
通常情况下,你迭代key Set,然后通过Map.get(key)来获取value。
来,给你两个例子:
Map map = new HashMap;
//... add key, value pairs to the Map
// iterate keys.
Iterator keyIterator = map.keySet().iterator();
while(keyIterator.hasNext()){
Integer aKey = keyIterator.next();
String aValue = map.get(aKey);
}
Iterator valueIterator = map.values().iterator();
while(valueIterator.hasNext()){
String aString = valueIterator.next();
}
第二个例子
Map map = new HashMap;
//... add key, value pairs to the Map
for(Integer aKey : map.keySet()) {
String aValue = map.get(aKey);
System.out.println("" + aKey + ":" + aValue);
}
for(String aValue : map.values()) {
System.out.println(aValue);
}
同理,不必进行类型检查,编译器知道key的类型一定是Integer,value的值一定是String.
5.java的泛型化类
相关文章暂无相关文章
java part part,java泛型指导手册(part1),指导手册part1相关推荐
- Java这个高级特性-泛型,很多人还没用过!
点击关注公众号,Java干货及时送达 泛型是 Java 的高级特性之一,如果想写出优雅而高扩展性的代码,或是想读得懂一些优秀的源码,泛型是绕不开的槛.本文介绍了什么是泛型.类型擦除的概念及其实现,最后 ...
- 【JAVA基础】java基础之-泛型详解
写在前面的话 脑子是个好东西,可惜的是一直没有搞懂脑子的内存删除机制是什么,所以啊,入行多年,零零散散的文章看了无数,却总是学习了很多也忘了很多. 痛定思痛的我决定从今天开始系统的梳理下知识架构,记录 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- java反射泛型类型,【Java反射】Java 泛型基础
Java Reflect 综述 方法的反射 成员变量的反射 构造函数的反射 类加载机制 在面向对象的世界里,万事万物皆对象. 但在Java里面有两样东西不是对象:静态的成员.普通数据类型类(但它们有封 ...
- Java基础篇:泛型与类型擦除
一.什么是泛型: 泛型的本质是 参数化类型,也就是说 将所操作的数据类型 指定为一个参数,在不创建新类的情况下,通过参数来指定所要操作的具体类型(类似于方法中的变量参数,此时类型也定义成参数形式),也 ...
- yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组
本篇文章好程序员为大家一下java为什么不支持泛型数组,希望对大家有所帮助. public class Pair { public void info( ) { System.out.println( ...
- java泛型方法 通配符_Java泛型教程–示例类,接口,方法,通配符等
java泛型方法 通配符 泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 将泛型与集合类一起使 ...
- Java笔记05-Collection、泛型、迭代器
Java笔记05-Collection.泛型.迭代器 [Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collection集合 1.1 集合概述 ...
- Java核心篇之泛型--day5
Java核心篇之泛型–day5 泛型是JDK5时引入的一个新特性,泛型提供了编译时类型安全检查的机制,该机制允许程序猿在编译时检测到非法的类型输入. 泛型的本质是参数化类型,也就是说操作的类型被指定为 ...
- java invoke 泛型_如何通过java反射调用含有泛型数组参数的方法
最近在看一个算法课程,老师用的是c++的template和函数指针来完成一个实现,于是我想用java通过反射和泛型来完成,但是出现了问题. 希望通过java反射以及泛型来实现动态测试SortClass ...
最新文章
- NetBeans 时事通讯(刊号 # 117 - Sep 16, 2010)
- 2021第三封拒信来自哈佛大学计算机科学与技术专业~
- Vue + Element UI——监听DOM元素高度和宽度解决方案整理(八种方法)
- 多线程处理海量数据的解决方案
- 爬虫基于ADSL动态获取ip
- PHP 做图片锐化处理
- Ubuntu 下修改 Could not reliably determine the serve
- 强烈推荐!商汤-港中文MMLab开源图像视频超分辨率工具箱MMSR
- NumPy Essentials 带注释源码 四、NumPy 核心和模块
- CAS:compare and swap
- 15. 深入解析Pod对象(二):使用进阶
- extmail如何登陆mysql_rhel5.4下postfix+mysql+extmail中mysql密码怎么设置?
- 实验一计算机基础和网络知识竞赛,邵阳市计算机基础知识竞赛试题
- 汽车扭杆弹簧式悬架系统设计-轿车扭杆弹簧式悬架设计方案
- 2018湘潭大学程序设计竞赛【E】
- EditPlus 编程背景色设置与代码高亮
- linux卸载软件wine,Ubuntu 卸载wine
- java 使用类的方式描述计算机_用JAVA设计,实现并测试一个计算机类,它包括如下内容...
- 刘天佐加盟《经济适用男》 变身木讷IT精英_0
- Orange:一个基于 Python 的数据挖掘和机器学习平台
热门文章
- 做游戏,学编程(C语言) 6 数组之空战游戏
- java 安卓权限_java – Android运行时权限 – 如何实现
- 备忘录模式(Memento Pattern)
- Python 攻克移动开发失败!
- CentOS 谢幕,Anolis OS 带来无限可能的未来
- 阿里“去 IOE”十二年,弹性计算如何二次去 I 和 E?
- 文科出身敲出 Instagram,被小札“挤”走,建新冠追踪网站
- 如何检查手机上的 App 是不是正版?
- 东京疫情数据开源当日斩获2k+ star,GitHub疫情项目源源不断
- 收好这份来自大厂技术大咖的“远程办公指南”