<强>首先请看如下代码:强>
公开课generictype { 公共静态void main (String str []) { Hashtable h=new散列表(); h。把(1,“字符串类型”); int=(字符串)h.get (1); System.out.println(一个); } }//执行结果 字符串类型//如果我们将上述由红色标出改的字符串为int执行后结果如下(更改后编译没有错误): 异常的线程“主要”. lang。ClassCastException: . lang。不能把java.lang.Integer字符串 genetictype.generictype.main (generic1.java: 10)
以上就是强制类型转换可能带来的典型错误,然而这个错误在编译期间无法知道,以至于在运行期间jvm检查后抛出类型转换异常。
<强>再看下述代码:强>
公开课generictype { 公共静态void main (String str []) { String> Hashtable<整数;h=new Hashtable<整数,String> (); h。把(1,“字符串类型”); 字符串a=h.get (1); System.out.println(一个); } }//执行结果 字符串类型//需要提出的是1,上述由红色标出的字符串如果改为int,在编译的时候会报的错 2 .在h.get(1)前面不需要再进行强制类型转换。>之前综上看来泛型的作用为:
1。就是是在编译的时候检查类型的安全(解决java中强制类型转换可能导致的错误),交给了编译器巨大的使命只
2。提高代码的重用率
<强>类型擦除:强>
类型擦除就是说编译器编译. java文件时,将类的泛型参数去掉,那么jvm加载字节码文件的时候对泛型不可见,这个过程就称为类型擦除。
与类型擦除有关的现象:
公开课generictype { 公共静态void main (String str []) { test1t=新test1 (); test1 tt=new test1 (); System.out.println (t.a); System.out.println (tt.a); } } 类test1
类型擦除的基本过程也比较简单:
1。将类型参数用顶级父类替换,这类一般是对象,如果指定了类型参数的上界的话,则使用这个上界。
, 2。去掉出现的类型声明,即去掉& lt;祝辞的内容。
例如:T get()方法声明就变成了对象();List
就变成了。接下来就可能需要生成一些桥接方法(桥方法)。这是由于擦除了类型之后的类可能缺少某些必须的方法,比如考虑下面的代码: 公开课generictype{公共静态孔隙主要(String str []) { 新test3 test3 t=(); t.getT (“11111”); } } 接口test2之前 <强>泛型的分类:泛型类、泛型接口,泛型方法,泛型异常强>
<强> 强>
公开课generictype { 公共静态void main (String str []) { String> test<整数;t=新test<整数,String> (); t。把(1、“str1”); t。把(2、“str2”); System.out.println (t.get (1)); System.out.println (t.get (2)); } } 类test{ 公共Hashtable h=新Hashtable (); 公共空间把(T T V V) { h。把(t, v); } 公共V (T T) { 返回h.get (t); } }//执行结果 str1 str2 在函数名前定义泛型参数,可以在传入参数列表,返回值类型、方法体里面引用
公开课generictype { 公共& lt; T>字符串getString (T obj) { 返回obj.toString (); } 公共静态void main (String str []) { generictype g=new generictype();//不需要类的泛型 System.out.println (g.getString (1)); System.out.println (g.getString (' a ')); System.out.println (g.getString (“a”); } }//执行结果 一个java泛型详解