泛型的作用
Java 本身是强类型语言,每次操作都需要指定类型,但是有时候一系列操作(例如集合操作)可以使用于多种类型,为了节省代码,可以将类型参数化,这就是泛型。
泛型的三种使用方式
泛型类
泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class Generic<T> { private T key;
public Generic(T key) { this.key = key; }
public T getKey() { return key; } }
Generic generic = new Generic("li");
|
其中 <T>
就代表泛型,意为 <T>
可以代表任意类型。注意的是泛型的类型只能是引用类型,而不能是基本类型。因为默认是<? extends Object>
。
泛型接口
泛型接口与泛型类的定义与使用基本相似。
泛型接口定义:
1 2 3 4
| public interface Generator<T> { public T next(); }
|
当类实现了泛型接口却未传入泛型实参时:
1 2 3 4 5 6 7
| class FruitGenerator<T> implements Generator<T>{ @Override public T next() { return null; } }
|
当类实现了泛型接口并传入泛型实参时:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
public class FruitGenerator implements Generator<String> {
private String[] fruits = new String[]{"Apple", "Banana", "Pear"};
@Override public String next() { Random rand = new Random(); return fruits[rand.nextInt(3)]; } }
|
泛型方法
泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型 。
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
public <T> T genericMethod(Class<T> tClass)throws InstantiationException , IllegalAccessException{ T instance = tClass.newInstance(); return instance; }
|
在泛型类里使用泛型方法
泛型方法里声明了泛型 ,即使泛型类中并未声明该泛型,该泛型方法也可以使用泛型,泛型方法也可声明泛型类中声明过的同名的泛型,此时泛型 会是一个全新的类型。可以与泛型类中的泛型 不是同一类型。
静态泛型方法
静态方法无法访问类上定义的泛型;如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上,即:如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法。
泛型方法的使用
1 2 3 4 5 6 7 8
| StaticFans.StaticMethod("adfdsa"); StaticFans.<String>StaticMethod("adfdsa");
StaticFans staticFans = new StaticFans(); staticFans.OtherMethod(new Integer(123)); staticFans.<Integer>OtherMethod(new Integer(123));
|
建议使用方法二,直接规定类型
泛型约定标记符
E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 表示不确定的 java 类型
S、U、V - 2nd、3rd、4th types
参考资料
java 泛型详解
泛型:工作原理及其重要性
Java 泛型详解:和 Class 的使用
Java 泛型详解