泛型的学习感悟:
通过在哈尔滨黑马双元的学习。我觉得学习实践比较多的就是集合了。而泛型在集合里面讲,就显得微不足道,基本属于了解性的知识了。但是我觉得泛型的深入学习对我们也是受益颇多的,所以自己对泛型做了一些笔记整理和总结。
首先泛型是一种特殊的类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的使用进行。也被称为参数化类型,可以把类型当做参数一样传递过来,在传递过来之前如果不明确,但是在使用的时候就就明确了。
泛型在程序定义上的体现:A:泛型类:将泛型定义在类上。B:当方法操作的引用数据类型不确定的时候,可以将泛型定义在方法上。C:静态方法上的泛型:静态方法无法访问类上定义的泛型。如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上。D:泛型接口
泛型的好处:1.提高了程序的安全性2.将运行期遇到的问题转移到了编译期3.省去了类型强转的麻烦
泛型的常见应用有:1.泛型类2.泛型方法3.泛型接口
其次要注意不能把List<String>传递给一个接收List<Object>参数的方法,要求传递的参数泛型与接收的参数泛型一致。并且Java中不支持泛型数组,如果想要使用泛型,请用List来替代Array,因为List可以提供编译期的类型安全保证,而Array却不能。泛型类型在使用前,类型是不确定的,不能用来创建对象。泛型类型为<Object>类型,代表只能接受元素为Objec类型的集合,要想实现任意参数化类型需要使用泛型通配符 < ? >来表示。
接下来讲述一下Java的泛型是如何工作的以及泛型擦除。
Java的泛型是伪泛型。在编译期间,所有的泛型信息都会被擦除掉。正确理解泛型概念的首要前提是理解类型擦除。
Java中的泛型基本上都是在编译器这个层次来实现的。在生产的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为泛型类型擦除。如在代码中定义的List<Object>和List<String>类型,在编译后都会变成List。JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除后保留的原始类型。原始类型就是擦除去了泛型信息,最后在字节码中的类型变量的真正类型。无论何时定义一个泛型类型,相应的原始类型都会被自动地提供。类型变量被擦除,并使用其限定类型(无限定的变量用Object)替代。
泛型限定:上限:?extends E:可以接收E类型或者E的子类型对象。下限:?super E:可以接收E类型或者E的父类型对象。
上限的使用:往集合中添加元素时,既可以添加E类型对象,又可以添加E的子类型对象。为什么?因为取的时候,E类型既可以接收E类对象,又可以接收E的子类型对象。
下限的使用:当从集合中获取元素进行操作的时候,可以用当前元素的类型接收,也可以用当前元素的父类型接收。
|