1. JDK 1.5 以后出现的安全机制,提高了编译时期的安全性.

  2. 泛型出现的好处:

    1. 将运行时期的问题 ClassCastException 转到了编译时期
    2. 避免了强制转换的麻烦
  3. 泛型出现的原因:

public static void main(String[] args){

    ArrayList al = new ArrayList();

    al.add("abc");
al.add("xyz");
al.add(4); // 此处存入的为 Integer 类型 Iterator it = al.iterator();
while(it.hasNext()){ String str = (String)it.next(); // 运行时,出现 ClassCastException 异常
System.out.println(str);
}
} // 泛型 public static void main(String[] args){ // 在定义集合时, 声明要存储元素的类型
ArrayList<String> al = new ArrayList<String>(); al.add("abc");
al.add("xyz");
al.add(4); // 编译时期,会报错 Iterator<String> it = al.iterator();
while(it.hasNext()){ String str = it.next(); // 使用泛型之后,此处不需要强转
System.out.println(str);
}
}
  1. 泛型什么时候使用?

    1. 当操作的引用数据类型不确定的时候, 就使用<>, 将要操作的引用数据类型传入即可.

      其实 <> 就是一个用于接收具体引用数据类型的参数范围.
    2. 在程序中, 只要使用到了带有 <> 的类或者接口, 就要明确传入的具体引用数据类型
  2. 泛型的擦除和补偿

    • 擦除: 程序运行时,会将泛型去掉, 即生成的 class 文件中是不带泛型的. 为了兼容运行时的类加载器.
    • 补偿: 程序运行时, 类加载器通过 getClass() 方法获取元素的类型,自动进行转换动作, 不需要使用者在强制转换.
  3. 通配符

// 通配符 ?

public static void main(String[] args){

    ArrayList<String> al = new ArrayList();
al.add("abc");
al.add("dfd"); HashSet<String> hs = new HashSet();
hs.add("gfj");
hs.add("ert"); printCollection(al);
printCollection(hs); } // 迭代并打印集合中的元素,
// 不同的集合均可使用父接口 Collection 接收,提高扩展性
public static void printCollection(Collection<String> al){
Iterator<String> it = al.iterator(); while(it.hasNext()){
System.out.println(it.next());
}
} // 通配符的使用
public static void main(String[] args){
ArrayList<String> al = new ArrayList();
al.add("abc");
al.add("wew"); ArrayList<Integer> al2 = new ArrayList();
al2.add(3);
al2.add(4); printCollection(al);
printCollection(al2);
} // ? 通配符, 也可以理解为占位符,代表未知类型.
// 提高程序扩展性
public static void printCollection(Collection<?> al){
Iterator<?> it = al.iterator(); while(it.hasNext()){
System.out.println(it.next());
} // 或者 泛型定义在方法上, 类型为 T, 注意使用时,需要先在修饰符 static 后面声明
public static <T> void printCollection(Collection<T> al){
Iterator<T> it = al.iterator(); while(it.hasNext()){
System.out.println(it.next());
}
}
}
  1. 泛型的限定

    • 向上限定: ? extends E , 可以接收 E 类型或者 E 类型的子类型

      一般存储元素的时候都是用上限,因为这样取出都是按照上限类型来运算, 不会出现类型隐患.

      例如 Collection 接口中的 boolean addAll(Collection<? extends E> c) 方法
    • 向下限定: ? super E, 可以接收 E 类型或者 E 类型的父类型.

      通常对集合中的元素进行取出操作时,可以使用下限

      例如 TreeSet 构造方法 TreeSet(Comparator<? super E> comparator)
// 向上限定, Student 和 Worder 对象都继承自 Person

public static void main(String[] args){
ArrayList<Worker> al = new ArrayList<Worker>();
al.add(new Worker("wangcai",32));
al.add(new Worker("lisi",24)); ArrayList<Student> al2 = new ArrayList<Student>();
al2.add(new Student("zhangsan",11));
al2.add(new Student("zhaoliu",26)); printCollection(al);
printCollection(al2);
} // 只打印 Person 对象的子类
public static void printColletion(Collection<? extends Person> al){
Iterator<? extends Person> it = al.iterator(); while(it.hasNext()){
// System.out.println(it.next()); Person p = it.next(); // 因为存入的都是 Person 对象的子类, 所以多态 System.out.println(p.getName()+"..."+p.getAge());
}
}

_参考资料_
- [JavaSE 基础视频(毕向东)](https://www.bilibili.com/video/av3120256/#page=9)
- [JDK 1.6 中文文档](http://tool.oschina.net/apidocs/apidoc?api=jdk-zh)

Java 集合框架之泛型的更多相关文章

  1. JAVA基础--JAVA 集合框架(泛型、file类)16

    一.集合总结 集合:Collection体系.Map体系. Collection体系:单列集合的共性操作规则. List:列表,可以重复,有下标,拥有特有的迭代器ListIterator. Array ...

  2. JAVA基础--JAVA 集合框架(泛型、file类)

    一.集合总结 集合:Collection体系.Map体系. Collection体系:单列集合的共性操作规则. List:列表,可以重复,有下标,拥有特有的迭代器ListIterator. Array ...

  3. Java高级特性 第1节 集合框架和泛型

    Java中,存储多个同类型的数据,可以用数组来实现,但数组有一些缺陷: 数组长度固定不变,布恩那个很好的适应元素数量动态变化的情况 可以通过数组.length获取数组长度,却无法直接获取数组中实际存储 ...

  4. 一起学 Java集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  5. (Collection, List, 泛型)JAVA集合框架一

    Java集合框架部分细节总结一 Collection List 有序,有下标,元素可重复 Set 无序,无下标,元素不可重复 以上为Collection接口 以ArrayList为实现类实现遍历:增强 ...

  6. Java集合框架(常用类) JCF

    Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ...

  7. Java集合框架的总结

    本篇文章先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析.当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进 ...

  8. 【JAVA集合框架之工具类】

    一.概述 JAVA集合框架中有两个很重要的工具类,一个是Collections,另一个是Arrays.分别封装了对集合的操作方法和对数组的操作方法,这些操作方法使得程序员的开发更加高效. public ...

  9. 【JAVA集合框架之Map】

    一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

随机推荐

  1. 【JavaScript】一个同步于本地时间的动态时间

    这样例很easy.了解JavaScript之后就是几行的代码便可以完毕的事情. 可是对于一些未接触过JavaScript的人来说,差点儿非常大project的样子.然后在网上苦苦寻觅代码,之后在茫茫的 ...

  2. 转-linux下配置socks5代理

    简介: 在Linux下有各种各样的代理程序可用,象最常用的Squid,是http/https代理,也能代理ftp请求,但它实际上 是个HTTP代理程序,不是ftp代理,但它能处理ftp代理请求,就象浏 ...

  3. 如何使用Photoshop(PS)将图片的底色变为透明

    很多时候需要将一张图片的底色变得透明.本文描述了使用PS将图片的一部分变得透明的方法.本例将一段艺术字的背景去掉,将背景透明的文字单独保存成图片,这样以后将这段文字粘贴到其他素材上的时候,就不用担心它 ...

  4. NumberUtils

    package cn.edu.hbcf.common.utils; import java.math.BigDecimal; import java.text.NumberFormat; import ...

  5. TI_DSP_corePac_带宽管理 - 1.2(仲裁寄存器)

    下图为仲裁寄存器,重要的是理解SDMAARB寄存器.在该寄存器中仅仅须要设计MAXWAIT值,PRI(优先级)设置要在外设(如FFTC,AIF2等)提供的仲裁寄存器中设置,由于是外设在訪问slave, ...

  6. spring的容器(控制反转、依赖注入)

    一.spring的容器 ”容器“是spring的一个重要概念,其主要作用是完成创建成员变量,并完成装配. 而容器的特点”控制反转“和”依赖注入“是两个相辅相成的概念. 控制反转:我们在使用一个类型的实 ...

  7. JS——覆盖显示,点击显示三层

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Windows 动态库创建和使用 part 2

    一.Windows动态库的创建: 1.先选择 "DLL" 和 “控项目” 2.添加一个头文件,一个源文件  CppDll.h,CppDll.cpp,一个模块定义文件 CppDll. ...

  9. 模式识别之贝叶斯---朴素贝叶斯(naive bayes)算法及实现

    处女文献给我最喜欢的算法了 ⊙▽⊙ ---------------------------------------------------我是机智的分割线----------------------- ...

  10. ACM 博弈(难)题练习 (第二弹)

    第一弹: Moscow Pre-Finals Workshop 2016 - Kent Nikaido Contest 1 Problem K. Pyramid Game http://opentra ...