泛型就像一个模板,编写好的代码可以被很多不同类型的对象重用。解决的问题就是滥用Object类型变量,然后强转。
如何自定义一个泛型类呢?
泛型类就是具有一个或多个类型变量的类,典型的就是ArrayList,经常用到。
public class Gen<T>{
private T first;
private T second;
public Gen(){}
public Gen(T first,T second){this.first=first;this.second=second;}
public T getFirst(){return first;}
public void setFirst(T value){first=value;}
}
在类名后面加上< T>即可,在java库中E表示集合的元素类型,K表示表的键类型,V表示值类型。T表示任意类型(还可以使用U或S)。
泛型方法
上面的get,set就是泛型方法,不局限于泛型类中,也可以定义在普通类中。
类型限制
如果要对类型变量进行限制,通过T来设置就行。如:
public static <T extends Comparable & Serivalizable> T method(){...}
这样写就表示T必须是他们的子类才可传入。
底层原理
在虚拟机中是没有泛型概念的,不管你定义的是什么泛型类,都会翻译成原始类型(如果有限定就是限定类型,没有限定就是Object类型),当我们去调用泛型方法时,编译器插入强制类型转换,也就是说编译器会将返回的Obejct类型,强转为我们定义的类型。
通配符
Gen< ? extends Comparable>
更高深的用法:
public < T extends Comparable< ? super T>> T method(){...}
注意
1.不能用基本类型实例化类型参数;比如Gen< double>是错误的,原因就是Object不能存储double值,但可以用Gen< Doubel>。
2.不能创建参数化类型的数组
如Gen< String> t=new Gen< String>[10];是错误的。
3.不能构造泛型数组。