Java泛型类与泛型方法

泛型类

定义一个泛型类和普通类的过程类似,区别就在于要在类名的地方使用尖括号”<>”声明泛型变量。
比如下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// T是泛型变量,在类名处被声明,除此之外与定义普通类无差别
// 泛型变量被声明后,可以在类中被使用
public class Pair<T>{
T first;
T second;
// 定义类的构造函数时不必再次声明泛型变量
public Pair(){
first = null;
second = null;
}
public Pair(T first, T second){
this.first = first;
this.second = second;
}
}

也可以声明多个泛型变量,如下面的例子:
1
2
3
4
5
6
7
8
9
// K,V都是泛型变量
public class Pair<K,V>{
K key;
V value;
public Pair(K k, V v){
key = k;
value = v;
}
}

泛型方法

泛型方法是指定义一个带有泛型参数的方法,该泛型方法在使用泛型参数之前需要声明泛型变量。
下面是一个例子

1
2
3
4
5
6
public class Main {
// T是泛型变量,使用尖括号声明,声明要放在修饰符(public static)和返回类型之间
public static <T> T getMiddle(T[] arr){
//示例方法含义是取数组中间的数
}
}

下面有个java程序可以运行一下试一试。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main
{
public static void main (String[] args)
{
print(new man());
}
public static <T extends Person> void print(T p){
p.print();
}
}
abstract class Person{
int sex;
void print(){};
}
class man extends Person{
@Override
void print(){
System.out.println("i am men");
}
}

Q&A:
Question:上面这个例子中,第7行的泛型变量T实际上只被使用了一次,是否将代码改为public static void print(<T extends Person> p),即同时声明和使用?
Answer:不可以,泛型变量使用前必须被声明,且声明应该被放在修饰符(public static)和返回类型之间,否则Java无法识别泛型变量。Java程序会对此段代码public static void print(<T extends Person> p)编译出错,错误结果为

1
2
3
4
5
6
Main.java:7: error: illegal start of type
public static void print(<T extends Person> p){
^
Main.java:7: error: > expected
public static void print(<T extends Person> p){
^