博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
泛型!擦除与转换!
阅读量:6653 次
发布时间:2019-06-25

本文共 1635 字,大约阅读时间需要 5 分钟。

在严格的泛型代码里,带泛型声明的类总是应该带着类型参数,但为了与老的java代码保持一致,也允许在使用带泛型声明的类时不指定类型参数。如果没有为这个泛型类指定类型参数,则该类型参数被称作一个raw type(原始类型),默认是声明该参数时指定的第一个上限类型。 当把一个具有泛型信息的对象赋给另一个没有泛型信息的对象时,则所有在<>之间的类型信息都被扔掉了。比如说一个List<String>类型被转换为List,则该List对集合元素的类型检查变成了类型变量的上限(即Object)。
class Demo
{T size;public Demo(){}public Demo(T size){this.size = size;}public void setT(T size){this.size = size;}public T getSize(){return this.size;}}
class TestEraser{public static void main(String[] args){//method1();method2();//method3();}/**把一个d赋给不带泛型信息的d2变量时,编译器会流失d对象的泛型信息,但因为Demo类型的参数类型上限是Number类,所以编译器依然知道d2.getSize()的返回值类型是Number类型。*/public static void method1(){Demo
d = new Demo<>(6);Integer id = d.getSize();Demo d2 = d; //把d对象赋给Demo类型的变量,会丢失泛型信息//Integer id2 = d2.getSize(); //编译错误Number id2 = d2.getSize();}/**下面程序中定义了一个List
对象,当把对象li赋给一个不带泛型的List变量list后,编译器就会流失前者的泛型信息,这就是擦除。但java允许直接把List对象赋给一个List
(Type可以是任何类型)的变量。从逻辑上看,List
是list的子类,如果直接把一个List对象赋给一个List
对象将引发编译错误,但对于泛型而言,可以直接把一个List对象赋给一个List
对象,编译器仅仅提示“未经检查的转换”,但要访问List
对象中的元素将会引发ClassCastException异常*/public static void method2(){List
li = new ArrayList<>();li.add(6);li.add(9);List list = li;List
ls = list; //警告,编译运行完全正常//但要访问ls集合里的元素,将会引起运行时异常System.out.println(ls.get(0)); }/**method2代码虽然可以编译通过,但实际上对list变量实际上引用的是List
集合,所以当试图把集合里的元素当成String类型的对象取出时,将引发ClassCastException类型转换异常,上面的代码可以转换成下面的代码就好理解了。*/public static void method3(){List li = new ArrayList();li.add(6);li.add(9);//运行异常System.out.println((String)li.get(0)); }}

转载于:https://www.cnblogs.com/yangzhi/archive/2012/10/16/3576635.html

你可能感兴趣的文章
定位网络攻击一例
查看>>
烂泥:ESXI开启SNMP服务
查看>>
6月第4周安全回顾 Firefox3存在严重漏洞 警惕Storm蠕虫
查看>>
关于CocoStudio中AtlasLabel控件后台编码的一点备注
查看>>
《统一沟通-微软-实战》-6-部署-7-部署移动功能-2
查看>>
在asp.net中备份还原SQL Server数据库
查看>>
先搞懂这八大基础概念,再谈机器学习入门!
查看>>
go语言笔记——调试还很弱,用gdb来做?可用panic和defer。格式化代码使用gofmt,貌似我的vim插件是自带...
查看>>
消息订阅
查看>>
分享我的“艺术品”:公共建筑能耗监测平台的GPRS通讯服务器的开发方法分享...
查看>>
Linux 安装.src.rpm源码包的方法
查看>>
c#将对象序列化为字符串和将字符串反序列化为对象
查看>>
“应用程序无法正常启动(oxc000007b)”解决方案
查看>>
用windows live writer写的
查看>>
NHibernate.Search 基于Lucene.NET的全文索引
查看>>
Drupal、IoT 和开源硬件之间的交集
查看>>
Android Loader详解四:回调及完整例子
查看>>
数据结构实验三:二叉树及其应用
查看>>
Oracle笔记 三、function 、select
查看>>
MySQL的左外连接
查看>>