这篇文章将为大家详细讲解有关Java中TypeVariable有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
TypeVariable,类型变量,描述类型,表示泛指任意或相关一类类型,也可以说狭义上的泛型(泛指某一类类型),一般用大写字母作为变量,比如K、V, E等。
<强>源码强>
public interface TypeVariable, extends Type {//才能获得泛型的上限,若未明确声明上边界则默认为对象 类型[],才能getBounds ();//才能获取声明该类型变量实体(即获得类,方法或构造器名) D 才能getGenericDeclaration ();//才能获得名称,即K、V E之类名称 String 才能getName (); }
<>强概述强>
说到TypeVariable
目前实现GenericDeclaration接口的类包括类,方法,构造函数,也就是说只能在这几种对象上进行范型变量的声明(定义).GenericDeclaration的接口方法getTypeParameters用来逐个获取该GenericDeclaration的范型变量声明。详情可查看:java源码解析之GenericDeclaration详解
类型变量的声明(定义):& lt; E>前后需加上尖括号
//1。在类(类)上声明(定义)类型变量 class A< T> { T 才能;; }//之后这里可用任意类型替换T,例如 A();//是否看着有点像集合?不错,集合就是泛型的一个典型运用//2 .在方法上声明(定义) public & lt; E>, void 测试(E e) {}//方法上,类型变量声明(定义)不是在参数里边,而且必须在返回值之前,静等修饰后//3 .声明(定义)在构造器上 public & lt; K>,一个(K k) {}
<强>【注意】强>类型变量声明(定义)的时候不能有下限(既不能有超级),否则编译报错。为什么? T扩展classA表示泛型有上限classA,当然可以,因为这样,每一个传进来的类型必定是classA(具有classA的一切属性和方法),但若是T超级classA,传进来的类型不一定具有classA的属性和方法,当然就不适用于泛型,说的具体点:
//假设 class A< T super classA> { T 才能;t; public 才能;void 测试(){ ,,,//这个时候你不能用t干任何事,因为你不确定t具有哪些属性和方法 ,,,//当然,t肯定是有对象方法的,但没意义 ,,} }
<>强源码详解强>
1。getBounds
获得该类型变量的上限(上边界),若无显式定义(扩展),默认为对象,类型变量的上限可能不止一个,因为可以用,符号限定多个(这其中有且只能有一个为类或抽象类,且必须放在扩展后的第一个,即若有多个上边界,则第一个,后必为接口)。
class A{ K 才能;关键; V 才能;价值; public 才能;static  void main (String [], args), throws 例外 {才能 ,,,类型[],types =, Main.class.getTypeParameters (); ,,,(Type Type :类型){ ,,,,,TypeVariable t =, (TypeVariable)类型; ,,,,,System.out.println (t.getGenericDeclaration ()); ,,,,,int size =, t.getBounds . length (); ,,,,,System.out.println (t.getBounds () [size 安康;1]); ,,,,,System.out.println (t.getName (), +,“\ n - - - - - - - - - - - - -分割线- - - - - - - - - - - -产生绯闻;); ,,,} ,,} }//输出结果 class com.fcc.test.Main interface com.fcc.test.interfaceB K - - - - - - - - - - - - -分割线- - - - - - - - - - - - - class com.fcc.test.Main class java . lang . object V - - - - - - - - - - - - -分割线- - - - - - - - - - - - -
<强> 2。getGenericDeclaration
强>
获得声明(定义)这个类型变量的类型及名称,即如:
<强>类com.xxx.xxx。classA或
公共空com.fcc.test.Main.test并不知道)或
公共com.fcc.test.Main() 强>
Constructor Constructor =, Main.class.getConstructor (); TypeVariable TypeVariable =, constructor.getTypeParameters () [0]; System.out.println (typeVariable.getGenericDeclaration ());//获得方法中声明(定义)的类型变量与上面类似以前Java中TypeVariable有什么用