- 1、本文档共138页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
public static void main(String[] args) { GenericTest1String gt1=new GenericTest1String(john); String temp1=gt1.getT(); GenericTest1Integer gt2=new GenericTest1Integer(); gt2.setT(10); Integer temp2=gt2.getT(); } } 编译为GenericTest1.class,然后,再通过javap命令来查看GenericTest1.class的情况,运行命令: javap –private GenericTest1,注意命令要在GenericTest1.class所在文件夹下执行, 可以得到如下代码: 1 public class ch2.GenericTest1 extends java.lang.Object{ 2 private java.lang.Object t; 3 public java.lang.Object get(); 4 public void setT(java.lang.Object); 5 public ch2.GenericTest1(java.lang.Object); 6 public ch2.GenericTest1(); 7 public static void main(java.lang.String[]); 8 } 第2-5行代码中都出现了Object,而没有T,这说明java源代码编译后,泛型T实际被Object代替,即编译后的类中其实已经不存在泛型了。 另外通过第三方的反编译工具,也可以看到GenericTest1.class中的main方法的代码,我们这里采用了jd-gui.exe工具反编译,得到的main方法代码如下: public static void main(String[] args) { GenericTest1 gt1 = new GenericTest1(john); String temp1 = (String)gt1.getT(); GenericTest1 gt2 = new GenericTest1(); gt2.setT(Integer.valueOf(10)); Integer temp2 = (Integer)gt2.getT(); } 泛型需要注意的问题 因为,java泛型在编译之后会把泛型擦除,所以要注意以下问题: (1)不能使用new E()和new E[]()。 把泛型参数E当做一个类使用来创建对象是不行的,即不能用语句E e=new E();来创建对象e,因为在运行时泛型参数E是不存在的,只存在于编译期。同理,不能创建泛型数组对象,例如,代码E[] e=new E[10];也是错误的。 (2)尽管通过使用不同类型参数所实例化出的同一泛型类的实例是不兼容的。但在运行时,泛型类型具有相同的Class类型。 例如: GenericTest1 String gt1 = new GenericTest1 String(); GenericTest1 Integer gt2 = new GenericTest1 Integer(); System.out.println(gt1.getClass() == gt2.getClass()); 输出结果为:true (3)instanceof不能用于泛型。 GenericTest1String gt2=new GenericTest1String(); if(gt2 instanceof GenericTest1String){}//错误,instanceof不能用于泛型 if(gt2 instanceof GenericTest1){}//正确 (4)泛型类中,不能用类的泛型参数来定义static变量和static方法。因为static变量和方法是在类的内存空间中,不在对象的空间中,而泛型类的泛型参数只有在实例化对象时才制定,所以在static的成员变量和static方法不能使用用泛型类的泛型参数。 (5)异常类不能是泛型的 泛型类不能继承Throwable,因为如果允许的话,那么意味着定义一个MyException继承Exception public class MyExceptionT extends Exception{ … } 调用时,java虚拟机必须检查try语句中抛出的异常,从而确定是否与catch语句中指定的类型匹配,但运行时类型信息是不会出现的。 try{…. }catch(MyExcep
文档评论(0)