Java泛型学习笔记 - 泛型方法

Posted ZhenyuGo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java泛型学习笔记 - 泛型方法相关的知识,希望对你有一定的参考价值。

泛型方法其实和泛型类差不多, 就是把泛型定义在方法上, 格式大概就是:
  public <类型参数> 返回类型 方法名(泛型类型 变量名) {...}
泛型方法又分为动态方法和静态方法,:
1. 动态泛型方法其实在前一篇博文中我已经用到了,

 1 public class Box<T> {
 2 
 3     private T obj;
 4     
 5     public Box() {}
 6 
 7     public T getObj() {
 8         return obj;
 9     }
10 
11     public void setObj(T obj) {
12         this.obj = obj;
13     }
14 
15     public Box(T obj) {
16         super();
17         this.obj = obj;
18     }
19 
20 }

其中的setObj()就是一个泛型方法, 只不过使用的是类中提供的泛型参数. 我们也可以给泛型方法定义自己的泛型参数:

1 public class Box<T> {
2 
3     /*...*/
4 
5     public <Q> void print(Q q) {
6         System.out.println(q);
7     }
8 
9 }

注意: 泛型参数要定义在返回值类型之前.
这样我们就可以在调用该方法时指定其自己的泛型了:

1 Box<Integer> b = new Box<>();
2 b.<String>print("Hello");
3 // b.<String>print(123); // 编译报错

2. 静态泛型方法在使用时必须指定自己的类型参数, 因为静态方法随着类的加载而加载. 在静态方法加载时, 并不存在该类的实例对象, 因此也就无法使用类所提供的类型参数:

1 public class Box<T> {
2 
3     /*...*/
4 
5     public static <Q> void print(Q q) {
6         System.out.println(q);
7     }
8 
9 }

其使用方法与动态方法类似.
3. 注意: 在调用有指定了自己的类型参数的泛型方法时, 其实并不需要显式地指定其泛型, Java在编译时完全可以自己推断出泛型的类型, 如:
动态:

1 b.print("Hello");

静态:

1 Box.print("Hello");

因为传入的类型很明显是String的, 就不用再指定了.

 

以上是关于Java泛型学习笔记 - 泛型方法的主要内容,如果未能解决你的问题,请参考以下文章

Java泛型学习笔记 - 泛型的介绍

Java:Effective java学习笔记之 优先考虑泛型和泛型方法

Java:Effective java学习笔记之 优先考虑泛型和泛型方法

Java泛型学习笔记 - 泛型的继承

Java学习笔记29(集合框架三:泛型)

Java讲课笔记35:初探泛型