概念
感觉和C++里的模板类与模板函数差不多。但还是有些规则不一样
分类:
1. 泛型类:
Class Test<T> {
private T variable;
Test(T key) {
this.vatiable = key;
}
T Get() {
return this.variable;
}
}
【注】:1. 在java中,泛型的类型,不能是简单类。即不能是int,double等类型
2. 即使是泛型类,在声明时,也可以不定义类型。即Test x = new Test(1);Test y = new Test(“2”);
2. 泛型接口:
与泛型类基本一致,只不过分了两种情况
- 当泛型接口,未传入泛型实参时:
//此时实现接口的类,也必须变成泛型类,否则会报错
Class Test<T> implements interface<T> {
@override
T function(){
....;
}
}
- 当泛型接口,已出入泛型实参:
这个方法好像有点憨憨,回来再学。
3. 泛型方法:
我的理解是:在方法里定义的泛型,不需要在意方法所在的类,是否是泛型类。因此判断一个方式是否是泛型方法的唯一办法,就是在方法的声明部分,是否有<T>。
【注】:在一个方法中存在泛型,不一定就是泛型方法,如:
import java.util.*;
public class Main {
public static void main(String[] args) {
Date x = Test.<Date>GetInstance("java.util.Date");
System.out.println(x);
}
}
class Test<E> {
static <T> T GetInstance(String name) {// 这才是一个泛型方法
try {
Class x = Class.forName(name);
return (T) x.newInstance();
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
public E function(E key) { //这不是一个泛型方法
System.out.println(key);
return key;
}
}
泛型通配符
1.分类:
- extends:上界通配符,规定集合里所有的元素,都必须是此类或其子类
- super:下界通配符,规定集合里的元素,都必须是此类或其父类
2. 用法:
import java.util.*;
public class Main {
public static void main(String[] args) {
Main.<TNode>function(new ArrayList<tnode>());//编译正常
Main.<tnode>function(new ArrayList<TNode>());//编译失败
}
static <T> void function(ArrayList<? extends T> list) {
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
class TNode {
int date;
}
class tnode extends TNode{
int x;
}