Java中TypeVariable有什么用

  介绍

这篇文章将为大家详细讲解有关Java中TypeVariable有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

TypeVariable,类型变量,描述类型,表示泛指任意或相关一类类型,也可以说狭义上的泛型(泛指某一类类型),一般用大写字母作为变量,比如K、V, E等。

<强>源码

public  interface  TypeVariable, extends  Type  {//才能获得泛型的上限,若未明确声明上边界则默认为对象   类型[],才能getBounds ();//才能获取声明该类型变量实体(即获得类,方法或构造器名)   D 才能getGenericDeclaration ();//才能获得名称,即K、V E之类名称   String 才能getName ();   }

<>强概述

说到TypeVariable就不得不提起java泛型中另一个比较重要的接口对象,GenericDeclaration接口对象。该接口用来定义哪些对象上是可以声明(定义)范型变量,所谓范型变量就是& lt; E延伸List>或者& lt; E>,也就是TypeVariable这个接口的对应的对象,TypeVariable中的D是GenericDeclaration延伸的,用来通过范型变量反向获取拥有这个变量的GenericDeclaration。

目前实现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有什么用