一、概述
泛型是jdk1.5之后引入的一个新特性,泛型提供了编译时类型安全的检测机制,这个机制允许程序员在编写程序的时候进行非法参数的检测。使用泛型要比使用Object类型要好的多的多,让代码具有了更高的可读性和安全性
泛型就是将原来具体的类型参数化,类似于方法中的变量参数,在使用的时候传入具体的类型
目的: 在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型
1.添加参数的时候可以进行参数的合法性判断
2.获取参数的时候不用进行强制类型的转换
泛型的本质是参数化类型 也就是所有操作的数据被指定为一个参数
一个栗子:
List arrayList = new ArrayList();
arrayList.add("aaaa");
arrayList.add(100);
for(int i = 0; i< arrayList.size();i++){
String item = (String)arrayList.get(i);
Log.d("泛型测试","item = " + item);
}
arrayList在内部维护的是一个Object的数组,就导致他可以存放任意类型,但是自获取的时候就会报错:ClassCastException
List<String> arrayList = new ArrayList<String>();
这样去声明,在添加Integer类型100的时候就会提示异常,这就是泛型
* 注意: java中的泛型只存在于编译阶段,运行阶段程序会采取去泛型化的措施
二、使用
泛型一般使用在:泛型类,泛型接口,泛型方法
1. 泛型类: list,set,map…
具有一个或多个类型变量的类
// 一般用T和U代表: 任意类型 K,V: 代表关键字和值 E:元素类型
public class Pair<T> {
private T name;
public Pair() {
}
public Pair(T name) {
this.name = name;
}
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
}
// 多参数
public class Pair<T,U> { ... }
实例化:
Pair<String>
2. 泛型接口:
public interface Generator<T> {
public T next();
}
// 接口的继承:
// 1.
public class FruitGenerator implements Generator<String> {
@Override
public String next() {
return "Fruit";
}
}
// 2.
public class FruitGenerator<T> implements Generator<T> {
private T next;
public FruitGenerator(T next) {
this.next = next;
}
@Override
public T next() {
return next;
}
public static void main(String[] args){
FruitGenerator<String> fruit = new FruitGenerator<>("Fruit");
System.out.println(fruit.next);
}
}
3. 泛型方法:
public class ArrayAlg {
public static <T> T getMiddle(T... a) {
return a[a.length / 2];
}
public static void main(String[] args){
System.out.println(ArrayAlg.getMiddle(1,2,3,4,5));
}
}
4. 泛型通配符
Integer是Number的一个子类,那么Generic和Generic是否可以看成具有父子关系的泛型类型呢?
答案是不能的。
同一种泛型可以对应不同的版本,但是不同版本的泛型是不兼容的。
Generic<?> g ;