黑马程序员--Java基础加强--05.【泛型通配符】【个人总结】
2013-07-29 14:41
771 查看
泛型通配符 总结
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------泛型通配符?总结
(1). ?的基本说明[1].【?使用的场合】
自定义类型参数是比较标准的。
但是,如果不想自定义类型参数,又想使用泛型,那么就采用?占位符进行类型参数占位。
[2]. 【?使用的含义和来历】
因为你也没定义类型参数是什么,所以你也不知道放什么类型。
语义上“不知道是什么”就用?来表示。所以泛型也使用?来表示不知道是什么的情况下么也要使用
(2). ?占位符和<>连用时的优势
当<?>, <? extends T>或者<? super T>整体跟在原始类型的后面的时候,就能实现<
>中的类型参数存在继承关系。这个时候,多态就可以应用到含有<?>的类型参数中。
(3). ? 占位符脱离开< >的限制
[1]. 当使用<?>进行类型参数占位的时候,函数体内与?相关的代码会有限制。
{1}. 从具有<?>限定的类型化参数的引用中取出元素的时候,元素的类型就是?,即元素的类型是未知的。
MyEclipse验证如下:
可以看出用<?>标记的Iterator<?>的引用it之后, it的方法next()返回值类型是 “?”类型的。
{2}. ?的元素仅仅可以使用Object类型的引用进行接收。换句话说,只有Object类型的引用可以指向?类型的元素
由于可能是?的元素是未知类型的,但是由于是Java中的类型,所以一定是Object类型或者Object的子类。所以使用Object类型的引用可以接收?的元素类型的对象。这是向上转型,javac自动完成。
e.g.
Iterator本身是Iterator<?>的,所以通过其引用it取出来的对象就是?类型的。这里可以看出这样类型的对象可以被Object类型的引用所指向,所以Object obj =it.next()编译通过。
{2}. ?类型的引用或者以?类型的引用为参数的方法是不可以指向或者被传入任何类型的对象或者实参。
因为?类型的引用或者参数有两种情况:
i). 如果?类型是Object,这个没问题,可以指向或者被传入任意类型的对象。
ii). 如果?类型不是Object类型,那就是Object的子类,那么你传入的类型未必就是?类型的子类,那就不能保证一定是向上转型,很有可能是向下转型。向下转型只能手动进行强制类型转换。所以你直接将其他类型的数据传入到?类型的参数或者赋值给?类型的引用时候,如果没有强制类型转换,就会出现错误。但是?类型是什么类型又不知道,所以没办法进行强制类型转换。
【结论】所以,不能使用?类型的引用或者以?类型的引用为参数的方法。
举例:
可以看出ArrayList<?> al声明的参数化类型引用出来的方法是以?类型的引用为参数的方法。所以和?类型相关的方法是不可以使用的。如果使用,编译报错!!
举例:
(3). <?>和<T>的关系
[1]. <?>和<T>的区别
{1}. <?>是真的没有类型。指的是运行期间,实际类型参数被<?>接受之后,取出来的变量仍然是?类型的变量。
{2}. <T>是有自己类型的。定义的时候,可以接受任何类型。但是运行期间,一旦实际参数传进来,T就被相应的类型取代,不再是未知的类型。
[2]. <?>和<T>的共性
{1}. <?> <===> <? extends Object>
<?>就相当于多态中的Object的作用,可以接受任何类型的参数
{2}. <T> <===> <T extends Object>
[3]. 练习:
{1}. Class<String> s=Class.forName("java.lang.String"); 编译能通过么?
{1}1. 先看Class.forName()的返回值类型是什么
===> public
static Class<?>forName(String className)
Class.forName()返回值类型是Class<?> ===>Class<?>是Class参数化类型的Object,相当于最高的父类。
{1}2.将Class<?>类型的对象赋值给Class<String>类型的相当于子类类型的引用,是一种向下类型转换,需要进行手动强制类型转换。这里没有,所以编译不能通过。
MyEclipse验证:
{1}3. 更正办法1:
Class<String>s=(Class<String>) Class.forName("java.lang.String");
{1}4. 更正办法2:
Class<?> s=Class.forName("java.lang.String");
{2}. 下面一段代码能否通过编译?
Class<?> y;
Class<String>x;
y =x;
x =y;
不能通过编译!!!
y具有参数化类型的最高类型,而Class<String>相当于Class<?>的子类。所以x =y; 相当于向下类型转换,没有强转,编译不能通过。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
相关文章推荐
- 黑马程序员--Java基础加强--06.【泛型通配符限定】【个人总结】
- 黑马程序员--Java基础加强--02.代码简化 书写规律I_原始数据类型【重载】【多态】【泛型】【泛型限定】【个人总结】
- 黑马程序员--Java基础加强--14.利用反射操作泛型III【解析关于泛型类型的细节信息的获取方法】【Method与泛型相关的方法】【个人总结】
- 黑马程序员--Java基础加强--03.代码简化 书写规律II_参数化数据类型【重载】【多态】【泛型】【泛型限定】【个人总结】
- 黑马程序员--Java基础加强--04.代码简化 书写规律III_数组参数【重载】【数组】【可变参数数组】【泛型可变参数数组】【个人总结】
- 黑马程序员--Java基础加强--12.利用反射操作泛型I【与反射+泛型相关的接口类型综述】【Type】【ParameterizedType】【个人总结】
- 黑马程序员--Java基础加强--16.利用反射操作泛型V【通过Constructor反射解析泛型构造方法】【通过Field反射解析泛型成员变量】【个人总结】
- 黑马程序员--Java基础加强--13.利用反射操作泛型II【TypeVariable】【GenericArrayType】【WildcardType】【Type及其子接口的来历】【个人总结】
- 黑马程序员--Java基础加强--15.利用反射操作泛型IV【通过反射Method解析泛型方法思路】【通过Method对四种Type子接口类型进行解剖】【使用递归对任意复合泛型类型进行彻底解剖】【个人
- 黑马程序员--Java基础加强--07.【反射创建对象 操作字段 调用方法的异同】【个人总结】
- 黑马程序员--Java基础加强--11.【MyEclipse使用快捷键提取方法的要点】【个人总结】
- 黑马程序员--Java基础加强--09.【MyEclipse的class文件所在的目录配置】【相对路径解析】【个人总结】
- 黑马程序员--Java基础加强--10.【PropertyDescriptor操作JavaBean VS 反射操作Java类】【个人总结】
- 黑马程序员--Java基础加强--08.【javac兼容编译原则】【可变参数数组编译】【个人总结】
- Java基础加强总结(二)——泛型
- 黑马程序员:Java基础总结----泛型(高级)
- 黑马程序员:基础加强(可变参数、增强for、枚举、javabBean、BeanUtils、注解、泛型)
- 黑马程序员——JAVA基础之泛型和通配符
- 黑马程序员--03.Java面向对象--05.子类对象初始化的过程【个人总结】
- 黑马程序员 java基础加强_泛型