一、介绍
泛型只在编译阶段有效。
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法。
Java泛型中常用的标记符含义:
- E - Element (在集合中使用,因为集合中存放的是元素)
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
- N - Number(数值类型)
- ? - 表示不确定的java类型
泛型判断:T instanceof Object
二、泛型的使用
1. 泛型类
泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。
举例:1
2
3
4
5
6
7
8
9
10
11
12public class Test<T>{
private T key;
public Test(T key) {
this.key = key;
}
public T getKey(){
return key;
}
}
2. 泛型接口
泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中,可以看一个例子:
定义一个泛型接口1
2
3public interface Generator<T> {
public T next();
}
当实现泛型接口的类,也要定义泛型,不然会报错1
2
3
4
5
6
7
8
9
10
11/**java
* 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中
* 即:class FruitGenerator<T> implements Generator<T>{
* 如果不声明泛型,如:class FruitGenerator implements Generator<T>,编译器会报错:"Unknown class"
*/
class FruitGenerator<T> implements Generator<T>{
@Override
public T next() {
return null;
}
}
传入泛型实参就不会1
2
3public class FruitGenerator implements Generator<String> {
//...
}
3. 泛型通配符
定义一个泛型通配符方法1
2
3public void showKeyValue1(Generic<?> obj){
Log.d("泛型测试","key value is " + obj.getKey());
}
?代表 当具体类型不确定的时候,这个通配符就是 ?1
2
3List<? extends Number> eList = null;
eList = new ArrayList<Integer>();
eList = new ArrayList<Long>();
4. 泛型方法
定义一个泛型方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19/**
* 泛型方法的基本介绍
* @param tClass 传入的泛型实参
* @return T 返回值为T类型
* 说明:
* 1)public 与 返回值中间<T>非常重要,可以理解为声明此方法为泛型方法。
* 2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
* 3)<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
* 4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
* 泛型的数量也可以为任意多个
* 如:public <T,K> K showKeyName(Generic<T> container){
* ...
* }
*/
public <T> T genericMethod(Class<T> tClass)throws InstantiationException ,
IllegalAccessException{
T instance = tClass.newInstance();
return instance;
}
5. 泛型方法与可变参数
T… args
6. 静态方法与泛型
如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法 。