Java源码解析之TypeVariable详解
TypeVariable,类型变量,描述类型,表示泛指任意或相关一类类型,也可以说狭义上的泛型(泛指某一类类型),一般用大写字母作为变量,比如K、V、E等。
源码
publicinterfaceTypeVariableextendsType{ //获得泛型的上限,若未明确声明上边界则默认为Object Type[]getBounds(); //获取声明该类型变量实体(即获得类、方法或构造器名) DgetGenericDeclaration(); //获得名称,即K、V、E之类名称 StringgetName(); }
概述
说到TypeVariable
目前实现GenericDeclaration接口的类包括Class,Method,Constructor,也就是说只能在这几种对象上进行范型变量的声明(定义)。GenericDeclaration的接口方法getTypeParameters用来逐个获取该GenericDeclaration的范型变量声明。详情可查看:Java源码解析之GenericDeclaration详解
类型变量的声明(定义):
//1.在类(Class)上声明(定义)类型变量 classA{ Ta; }//之后这里可用任意类型替换T,例如 A as=newA (); //是否看着有点像集合?不错,集合就是泛型的一个典型运用 //2.在方法上声明(定义) public voidtest(Ee){} //方法上,类型变量声明(定义)不是在参数里边,而且必须在返回值之前,static等修饰后 //3.声明(定义)在构造器上 public A(Kk){}
【注意】类型变量声明(定义)的时候不能有下限(既不能有super),否则编译报错。为什么?TextendsclassA表示泛型有上限classA,当然可以,因为这样,每一个传进来的类型必定是classA(具有classA的一切属性和方法),但若是TsuperclassA,传进来的类型不一定具有classA的属性和方法,当然就不适用于泛型,说的具体点:
//假设 classA{ Tt; publicvoidtest(){ //这个时候你不能用t干任何事,因为你不确定t具有哪些属性和方法 //当然,t肯定是有Object方法的,但没意义 } }
源码详解
1.getBounds
获得该类型变量的上限(上边界),若无显式定义(extends),默认为Object,类型变量的上限可能不止一个,因为可以用&符号限定多个(这其中有且只能有一个为类或抽象类,且必须放在extends后的第一个,即若有多个上边界,则第一个&后必为接口)。
classA{ Kkey; Vvalue; publicstaticvoidmain(String[]args)throwsException { Type[]types=Main.class.getTypeParameters(); for(Typetype:types){ TypeVariablet=(TypeVariable)type; System.out.println(t.getGenericDeclaration()); intsize=t.getBounds().length; System.out.println(t.getBounds()[size-1]); System.out.println(t.getName()+"\n-------------分割线-------------"); } } } //输出结果 classcom.fcc.test.Main interfacecom.fcc.test.interfaceB K -------------分割线------------- classcom.fcc.test.Main classjava.lang.Object V -------------分割线-------------
2.getGenericDeclaration
获得声明(定义)这个类型变量的类型及名称,即如:
classcom.xxx.xxx.classA或
publicvoidcom.fcc.test.Main.test(java.util.List)或
publiccom.fcc.test.Main()
Constructorconstructor=Main.class.getConstructor(); TypeVariabletypeVariable=constructor.getTypeParameters()[0]; System.out.println(typeVariable.getGenericDeclaration()); //获得方法中声明(定义)的类型变量与上面类似
3.getName
获得这个类型变量在声明(定义)时候的名称
以上就是本文关于Java源码解析之TypeVariable详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Java源码解析之object类、java.lang.Void类源码解析等,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。