JAVA泛型

一、介绍

泛型只在编译阶段有效。
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法。
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
12
public class Test<T>{ 

private T key;

public Test(T key) {
this.key = key;
}

public T getKey(){
return key;
}
}

2. 泛型接口

泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中,可以看一个例子:

定义一个泛型接口

1
2
3
public 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
3
public class FruitGenerator implements Generator<String> {
//...
}

3. 泛型通配符

定义一个泛型通配符方法

1
2
3
public void showKeyValue1(Generic<?> obj){
Log.d("泛型测试","key value is " + obj.getKey());
}

?代表 当具体类型不确定的时候,这个通配符就是 ?

1
2
3
List<? 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. 静态方法与泛型

如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法 。

参考:
http://blog.csdn.net/s10461/article/details/53941091/

lightquant wechat
欢迎您订阅灯塔量化公众号!