在学习java的过程中,我们常常会遇到泛型方法,泛型方法使得该方法能独立于类而产生变化。下面,我们可以写一个泛型方法,使其方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

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

无论何时,只要你能做到,你就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛型化,那么就应该只使用泛型方法,因为它可以使事情更清楚明白。另外,对于一个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) {

// ...

}

}

版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

java 自定义泛型方法_Java中自定义泛型方法的使用相关推荐

  1. 自定义关键字_Java中的自定义异常

    在测试脚本的编写中会需要使用自定义异常,通常可以很容易地用「Java」创建自定义异常类.它可以是已检查或未检查的异常.下面将演示一个简单的示例来检查Java中自定义异常的创建. 如何创建自定义异常类 ...

  2. jsp中用java写标签id_jsp中自定义标签用法实例分析

    本文实例讲述了jsp中自定义标签用法.分享给大家供大家参考.具体如下: 这里简单的写了一个自定义标签,自己定义标签的好处就是在jsp页面中可以使用自己定义的功能,完全与Java代码分离 1. tld文 ...

  3. java 泛型机制_java中的泛型机制

    泛型 这种语法机制,只在程序编译阶段起作用,只是给编译器参考的.(运行阶段泛型没用) 使用了泛型好处是什么? 第一:集合中存储的元素类型统一. 第二:从集合中取出的元素类型是泛型指定的类型,不需要进行 ...

  4. java file 方法_JAVA中File的常用方法

    一.File类中包含了很多获得文件或文件夹属性的方法,使用起来比较方便,下面将常见的方法介绍如下: a.createNewFile方法 public boolean createNewFile() t ...

  5. java异常面试_java中异常的面试

    https://blog.csdn.net/qq_36523638/article/details/79363652 1) Java中的检查型异常和非检查型异常有什么区别? 这又是一个非常流行的Jav ...

  6. java类注释_java中注解

    一.什么是注解 注解是jdk5.0引入的新技术! 注解(Annotation):java中对某一程序片段注释说明.这个注释说明能被其它程序读到并执行相应操作! 二.注解的作用 1.能对于程序做出解释, ...

  7. java properties 参数_Java中Properties 类的详细使用

    我把你的头像,设置成我的名字,此刻你便与我同在. 我把你的名字,写进我的代码里面,以后,我的世界便存在着你. 一.Properties 类 Properties 类位于 java.util.Prope ...

  8. java有道_java中的各种流(老师的有道云笔记)

    内存操作流-字节 之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操作流.此时得使用内存流完成内存的输入和输出操作. 如果程序运行过程中要产生一些临时文件,可采用虚拟文 ...

  9. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  10. python函数自定义教程_Python中自定义函数的教程

    在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数 ...

最新文章

  1. 5G时代到来,人工智能设备如何重塑TMT行业
  2. Authentication 方案优化探索(JWT, Session, Refresh Token, etc.)
  3. JSP的概念||原理||JSP的脚本||JSP的内置对象||response.getWriter()和out.write()的区别||案例:改造Cookie案例
  4. mysql linuxl环境搭建_Linux环境下的MySQL搭建
  5. 【HDU - 1026 】Ignatius and the Princess I (bfs + 记录路径)
  6. 【AI视野·今日Robot 机器人论文速览 第二十一期】Fri, 24 Sep 2021
  7. matlab课程目的,《Matlab应用》课程教学大纲.doc
  8. sublime3快捷键
  9. UML图中聚合、组合、关联、依赖、泛化的强弱关系
  10. Linux Apache服务详解——Apache服务访问控制
  11. word20161205
  12. python UI自动化无界面运行
  13. gtest -UT测试框架
  14. 觉得为时已晚的时候,恰恰是最早的时候。
  15. 20181012 excel 填充序列 快捷键
  16. PHP是世界上最好语言吗?
  17. ps去水印教程_【PS教程】超实用6大去水印去除方法!
  18. java使用poi实现excel保护工作表实例代码(支持.xls和.xlsx)
  19. 关于正则表达式里含有空格的问题
  20. iPhone 5s--- iPhone x越狱详细教程,MacOS系统

热门文章

  1. c++ 专题 2 面向对象:常量成员函数
  2. 计算机信息专业致谢词,计算机专业毕业论文致谢词.doc
  3. 配置vhost、https、重定向
  4. 免费创建GOOGLE共享网盘
  5. opera安装java插件_欧朋浏览器Opera插件安装指南
  6. 最新行政区划代码省市区三级 乡镇街道四级 村五级 数据库(2021年3月版 )
  7. dell r710重装系统_dell服务器安装系统指南
  8. linux设置家目录,usermod更改用户家目录
  9. 无人机飞行控制逻辑以及不稳定原因分析
  10. android支持wifi11ad,不得不知道的WIFI标准:802.11ad、ah、af