Java自定义泛型方法

Java自定义泛型方法泛型方法使得该方法能独立于类而产生变化 我们可以写一个泛型方法 该方法在调用时可以接收不同类型的参数 根据传递给泛型方法的参数类型 编译器适当地处理每一个方法调用 nbsp 以下是一个基本的指导原则 无论何时 只要你能做到 你就应该尽量使用泛型方法 也就是说 如果使用泛型方法可以取代将整个类泛型化 那么就应该只使用泛型方法 因为它可以使事情更清楚明白 另外 对于一个 static 的方法而言 无法

泛型方法使得该方法能独立于类而产生变化。我们可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

 

以下是一个基本的指导原则:

无论何时,只要你能做到,你就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛型化,那么就应该只使用泛型方法,因为它可以使事情更清楚明白。另外,对于一个static的方法而言,无法访问泛型类的类型参数。所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。

 

下面是定义泛型方法的规则: 

1)所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的

)。

2)每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。

3)类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。

4)泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。

 

下面举一些泛型方法的示例:

/ * public 与 返回值中间 
  
    非常重要,可以理解为声明此方法为泛型方法。 * 只有声明了 
   
     等的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。 * 
    
      表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。 * 与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。 */ public class GenericMethods { public 
     
       void genericMethod1(T t){ System.out.println(t.getClass().getName()); } public 
      
        T genericMethod2( Class 
       
         tClass ) throws InstantiationException , IllegalAccessException { T t = tClass.newInstance(); return t; } public static 
        
          void genericMethod3( T[] inputArray ) { // 输出数组元素 for ( E element : inputArray ){ System.out.printf( "%s ", element ); } } } 
         
        
       
      
     
    
  

说明一下,定义泛型方法时,必须在返回值前边加一个

,来声明这是一个泛型方法,持有一个泛型T,然后才可以用泛型T作为方法的返回值或参数类型等。

泛型类是在实例化类的时候指明泛型的具体类型,而泛型方法是在调用方法的时候指明泛型的具体类型 。

 

泛型方法可以在任何地方和任何场景中使用,但是有一种情况是非常特殊的,当泛型方法出现在泛型类中时,我们再通过一个例子看一下:

/ * 这是一个泛型类 */ class GenericClassDemo 
  
    { / * 这个不是泛型方法,只是使用了泛型类中已声明的T */ public void show1(T t){ System.out.println(t.toString()); } / * 泛型方法,使用泛型E,这种泛型E可以为任意类型。可以类型与T相同,也可以不同。 * 由于下面的泛型方法在声明的时候声明了泛型 
   
     ,因此即使在泛型类中并未声明泛型, * 编译器也能够正确识别泛型方法中识别的泛型。 */ public 
    
      void show2(E e){ System.out.println(e.toString()); } / * 在泛型类中声明了一个泛型方法,使用泛型T,注意这个T是一种全新的类型; * 可以与泛型类中声明的T不是同一种类型。 */ public 
     
       void show3(T t){ System.out.println(t.toString()); } } 
      
     
    
  

 

泛型方法和可变参数

泛型方法与可变参数列表能很好地共存:

public class GenericMethodTest { public 
  
    void printArgs( T... args ){ for(T t : args){ System.out.print(t + " "); } } public static 
   
     List 
    
      toList(T... args){ List 
     
       result = new ArrayList 
      
        (); for(T item:args) result.add(item); return result; } public static void main(String[] args) { GenericMethodTest gmt = new GenericMethodTest(); gmt.printArgs("A","B"); // A B List ls = GenericMethodTest.toList("A"); System.out.println(ls); // [A] ls = GenericMethodTest.toList("A","B","C"); System.out.println(ls); // [A,B,C] } } 
       
      
     
    
  

 

静态方法使用泛型

静态方法无法访问类上定义的泛型,如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上。即:如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法 。

public class GenericTest 
  
    { / * 如果在类中定义使用泛型的静态方法,需要添加额外的泛型声明 * 即使静态方法不可以使用泛型类中已经声明过的泛型(需将这个方法定义成泛型方法) * 如:public static void genericMethod(T t){..},此时编译器会提示错误信息: * "StaticGenerator cannot be refrenced from static context" */ public static 
   
     void genericMethod(T t) { // ... } } 
    
  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227104.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午9:56
下一篇 2026年3月16日 下午9:56


相关推荐

  • JAVASCRIPT拷贝内容到剪切板

    JAVASCRIPT拷贝内容到剪切板

    2021年8月12日
    59
  • TDD-LTE与FDD-LTE区别之频段分配[通俗易懂]

    TDD-LTE与FDD-LTE区别之频段分配[通俗易懂]之前转载了一个惯有TDD与FDD异同点比较的博客,看了之后觉得还是根据异同点进行分类整理一下,这样应该能够更好的有利于大家的记忆与理解。所以这一节我们就先来整理一下这两者的频段与双工方式的区别。TDD与FDD分别是时分双工和频分双工的英文简写;FDD系统在发送和接收数据上使用不同的频率,在上行和下行频率之间有双工间隔,现在常见的2G,3G制式的网络中,GSM,CDMA,WCDM

    2022年6月3日
    45
  • Linux下安装lrzsz

    Linux下安装lrzsz一. 手动编译安装1、 下载安装包,wget https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz  或者是  上传已经下载好的安装包lrzsz2、 cd /usr/local/src/3、 mkdir lrzsz4、 cd lrzsz/5、 解压:tar -xvf lrzsz-0.12.20.tar.gz6、 cd lrzsz…

    2022年6月23日
    28
  • md5加密算法是可逆的_md5为什么不可逆

    md5加密算法是可逆的_md5为什么不可逆md5加密以上代码输出结果:注:md5算法是不可逆的,所以经过md5加密过的字符串是无法还原(解密)的。一般用作登陆验证的时候,也是要先经过md5加密然后去数据库验证密码是否正确。据说md5是被

    2022年8月3日
    6
  • SpringBoot整合微信登录

    SpringBoot整合微信登录文章目录 SpringBoot 整合微信登录 1 准备工作 1 1 获取微信登录凭证 1 2 配置文件 1 3 添加依赖 1 4 创建读取公共常量的工具类 1 5HttpClient 工具类 2 实现微信登录 2 1 具体流程 2 2 生成微信扫描的二维码 请求 CODE 2 3 回调 SpringBoot 整合微信登录 1 准备工作 1 1 获取微信登录凭证前往官网微信开放平台 com 完成以下步骤 注册邮箱激活完善开发者资料开发者资质认证创建网站应用 1 2 配置文件在配置文件 applicatio

    2026年1月20日
    1
  • C++面试题之浅拷贝和深拷贝的区别「建议收藏」

    C++面试题之浅拷贝和深拷贝的区别「建议收藏」先考虑一种情况,对一个已知对象进行拷贝,编译系统会自动调用一种构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。先看一个例子,有一个学生类,数据成员时学生的人数和名字:#include<iostream>usingnamespacestd;classStudent{private: intnum; c…

    2022年10月1日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号