看一段程序先:

 1 package daxue.test;
 2
 3 import java.util.ArrayList;
 4 import java.util.Date;
 5 import java.util.List;
 6
 7 public class Test {
 8  public static void main(String[] args) {
 9
10 //定义一个参数类型为String的List,名字为list_str
11   List<String> list_str =  new ArrayList<String>();
12   list_str.add("abc");
13
14
15  //又定义一个参数类型为Date的List,名字为list_date
16   List<Date> list_date = new ArrayList<Date>();
17
18
19  //定义一个没有参数的List,名字为list
20 //将list_str赋值给list
21   List list = list_str;
22
23
24 //再将list赋值给list_date
25   list_date = list;
26   list_date.add(new Date());
27
28
29   System.out.println(list_date);
30
31   for (Date date : list_date) {
32    System.out.println(date);
33   }
34  }
35 }

上边这个程序运行到for循环的地方就出错了,原因很简单,我们通过反复赋值,将list_date最终指向了list_str,也就是说 list_date 和 list_str 现在指向了同一个List,标记为AList。我们可以通过 list_date向AList添加Date类型的对象,我们也可以通过list_str向AList中添加String类型的变量。AList中既有String类型的变量,又有Date类型的变量,所以在for循环的时候把String类型的变量强制转换为Date 类型的时候出错了。。。。

于是,我们就引出了“类型擦除”这个概念:编译器编译后,在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除。如在代码中定义的List<Date>和List<String>等类型,在编译之后都会变成List。

也就是说:编译器编译后的List只是一个普通的List,因此它才不会管我们往里边放什么类型的对象,java5的泛型机制,只是停留在编译之前,通过在语法上限制你不能往list_str中放入其他对象。

java在版本5才出现了泛型的概念,那么它为了兼容5以前的版本,所以在赋值的时候它允许我们这样赋值:

1: List list = new ArrayList<String>()

2: List<Date> list_date  = new ArrayList()

在等号的两边,允许有一边使用泛型,编译器能通过,但只给出警告。因为编译器是在你是确定这样赋值不会出错的情况下,使得赋值成立的。

我们利用这种赋值,巧妙的躲开了编译器的语法限制。

另外需要注意的就是:赋值时,在泛型参数没有上溯、下溯的概念,3和4的赋值方式是不允许的,尽管我们认为Object是String的父类。

3:List<Object> list_obj = new ArrayList<String>()

4:List<String> list_str = new ArrayList<Object>()

转载于:https://www.cnblogs.com/ishang/archive/2012/07/06/2579708.html

java 泛型研究 初探索(一)相关推荐

  1. java 泛型 讲义

    Java泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性.到如今看来,它已经成为Java日常开发中必须使用的.最常用的语法之一.关于泛型可以参考本文档~ 文章目录 Java泛 ...

  2. 3万字死磕Java泛型所有细节知识点,看这一篇就够了

    1 泛型 1.0 前言--为什么要死磕Java泛型 不知道阅读这篇文章的你是否曾跟我一样,在没有阅读<Java核心技术>前查阅了大量的Java泛型文章,但是在实际使用泛型的过程中,总是觉得 ...

  3. 聊一聊Java 泛型通配符 T,E,K,V,?

    欢迎关注方志朋的博客,回复"666"获面试宝典 | 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者 ...

  4. Java泛型的类型擦除

    写在前面:最近在看泛型,研究泛型的过程中,发现了一个比较令我意外的情况,Java中的泛型基本上都是在编译器这个层次来实现的.在生成的Java字节代码中是不包含泛型中的类型信息的.使用泛型的时候加上的类 ...

  5. 深入理解 Java 泛型擦除机制

    我们都知道 Java 中的泛型可以在编译期对类型检查,避免类型强制转化带来的问题,保证代码的健壮性.不同语言对泛型的支持也不一样,Java 中的泛型类型在编译期会擦除,下面一个例子可以证明这一点: p ...

  6. JAVA泛型知识(一)

    Java泛型知识(二)<? extends T>和<? super T> Java1.5泛型指南中文版(Java1.5 Generic Tutorial) 目        录 ...

  7. java泛型(一)、泛型的基本介绍和使用

    转载地址  http://m.blog.csdn.net/article/details?id=7864531 现在开始深入学习java的泛型了,以前一直只是在集合中简单的使用泛型,根本就不明白泛型的 ...

  8. Java泛型教程–示例类,接口,方法,通配符等

    泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 在集合类中使用泛型非常容易,但是它提供了比仅创 ...

  9. java 获取泛型_聊聊Java泛型擦除那些事

    >版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/89789849 出自:shushen ...

  10. Java基础系列二:Java泛型

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.泛型概述 1.定 ...

最新文章

  1. SQL语句求解同一人物不同日期,某一属性的差值
  2. java神剑30变_改动对比 - 神剑养成(一) (MengSword1) - MC百科|最大的Minecraft中文MOD百科...
  3. oracle or 循环 查询,Oracle的循环和Corsor
  4. 【Linux操作系统分析】设备驱动处理流程
  5. c语言数码管流动显示一个数,51单片机数码管动态显示 - 数码管动态扫描显示01234567程序(三种方案)...
  6. python会议室系统预定_会议室预定系统
  7. TCP/IP——链路层简记
  8. 苹果电脑win10蓝牙音响卡顿_Macbook Pro 2017安装win10以后蓝牙鼠标卡顿
  9. linux服务器弱密码检查,linux系统弱密码检测
  10. 文件保险柜 v2.6 官网
  11. FreeCodeCamp学习--Falsy Bouncer
  12. 图像分类之CutMix论文阅读
  13. xp系统打印机服务器报错,互联网要点:Win7系统连接XP共享打印机报错0X000004如何解决...
  14. 关于前端接口报错500原因
  15. 转: 雅虎35条优化黄金守则
  16. 用python对CSV文件中的数据进行统计分析
  17. 如何进行120hz的屏幕录像 OBS
  18. EasyExcel基本使用-简单导入
  19. excel shell合成_shell快速合并多个Excel表格
  20. Android百度地图的基本使用

热门文章

  1. CSS Margin 边距详解、CSS 实现水平垂直居中、overflow 兼容 Safari 浏览器
  2. linux单用户可以删除文件么,Linux单用户模式详解 及应用场景
  3. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_4_缓冲流的效率测试_复制文件...
  4. Codeforces.871D.Paths(莫比乌斯反演 根号分治)
  5. 21模块-orientation【管理设备的方向信息】
  6. python+selenium+Firefox+pycharm版本匹配
  7. HTTP协议中GET、POST和HEAD的介绍
  8. 常用的正则表达式及符号诠释
  9. 虫师Selenium2+Python_11、自动化测试项目实战
  10. *P1108 低价购买 dp