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相关推荐

  1. Java这个高级特性-泛型,很多人还没用过!

    点击关注公众号,Java干货及时送达 泛型是 Java 的高级特性之一,如果想写出优雅而高扩展性的代码,或是想读得懂一些优秀的源码,泛型是绕不开的槛.本文介绍了什么是泛型.类型擦除的概念及其实现,最后 ...

  2. 【JAVA基础】java基础之-泛型详解

    写在前面的话 脑子是个好东西,可惜的是一直没有搞懂脑子的内存删除机制是什么,所以啊,入行多年,零零散散的文章看了无数,却总是学习了很多也忘了很多. 痛定思痛的我决定从今天开始系统的梳理下知识架构,记录 ...

  3. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  4. java反射泛型类型,【Java反射】Java 泛型基础

    Java Reflect 综述 方法的反射 成员变量的反射 构造函数的反射 类加载机制 在面向对象的世界里,万事万物皆对象. 但在Java里面有两样东西不是对象:静态的成员.普通数据类型类(但它们有封 ...

  5. Java基础篇:泛型与类型擦除

    一.什么是泛型: 泛型的本质是 参数化类型,也就是说 将所操作的数据类型 指定为一个参数,在不创建新类的情况下,通过参数来指定所要操作的具体类型(类似于方法中的变量参数,此时类型也定义成参数形式),也 ...

  6. yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组

    本篇文章好程序员为大家一下java为什么不支持泛型数组,希望对大家有所帮助. public class Pair { public void info( ) { System.out.println( ...

  7. java泛型方法 通配符_Java泛型教程–示例类,接口,方法,通配符等

    java泛型方法 通配符 泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 将泛型与集合类一起使 ...

  8. Java笔记05-Collection、泛型、迭代器

    Java笔记05-Collection.泛型.迭代器 [Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collection集合 1.1 集合概述 ...

  9. Java核心篇之泛型--day5

    Java核心篇之泛型–day5 泛型是JDK5时引入的一个新特性,泛型提供了编译时类型安全检查的机制,该机制允许程序猿在编译时检测到非法的类型输入. 泛型的本质是参数化类型,也就是说操作的类型被指定为 ...

  10. java invoke 泛型_如何通过java反射调用含有泛型数组参数的方法

    最近在看一个算法课程,老师用的是c++的template和函数指针来完成一个实现,于是我想用java通过反射和泛型来完成,但是出现了问题. 希望通过java反射以及泛型来实现动态测试SortClass ...

最新文章

  1. NetBeans 时事通讯(刊号 # 117 - Sep 16, 2010)
  2. 2021第三封拒信来自哈佛大学计算机科学与技术专业~
  3. Vue + Element UI——监听DOM元素高度和宽度解决方案整理(八种方法)
  4. 多线程处理海量数据的解决方案
  5. 爬虫基于ADSL动态获取ip
  6. PHP 做图片锐化处理
  7. Ubuntu 下修改 Could not reliably determine the serve
  8. 强烈推荐!商汤-港中文MMLab开源图像视频超分辨率工具箱MMSR
  9. NumPy Essentials 带注释源码 四、NumPy 核心和模块
  10. CAS:compare and swap
  11. 15. 深入解析Pod对象(二):使用进阶
  12. extmail如何登陆mysql_rhel5.4下postfix+mysql+extmail中mysql密码怎么设置?
  13. 实验一计算机基础和网络知识竞赛,邵阳市计算机基础知识竞赛试题
  14. 汽车扭杆弹簧式悬架系统设计-轿车扭杆弹簧式悬架设计方案
  15. 2018湘潭大学程序设计竞赛【E】
  16. EditPlus 编程背景色设置与代码高亮
  17. linux卸载软件wine,Ubuntu 卸载wine
  18. java 使用类的方式描述计算机_用JAVA设计,实现并测试一个计算机类,它包括如下内容...
  19. 刘天佐加盟《经济适用男》 变身木讷IT精英_0
  20. Orange:一个基于 Python 的数据挖掘和机器学习平台

热门文章

  1. 做游戏,学编程(C语言) 6 数组之空战游戏
  2. java 安卓权限_java – Android运行时权限 – 如何实现
  3. 备忘录模式(Memento Pattern)
  4. Python 攻克移动开发失败!
  5. CentOS 谢幕,Anolis OS 带来无限可能的未来
  6. 阿里“去 IOE”十二年,弹性计算如何二次去 I 和 E?
  7. 文科出身敲出 Instagram,被小札“挤”走,建新冠追踪网站
  8. 如何检查手机上的 App 是不是正版?
  9. 东京疫情数据开源当日斩获2k+ star,GitHub疫情项目源源不断
  10. 收好这份来自大厂技术大咖的“远程办公指南”