泛型
一、泛型
定义:在jdk1.5版本以上,java为了解决集合中不同对象类型带来的安全隐患, 而产生的类型安全机制。
使用方法:
在创建集合的时候,在集合类型后面加上尖括号<>,括号中写上集合中准备传入的对象(元素)类型,
for example: ArrayList<String> al = new ArrayList<String>();
LinkedList<String> ll = new LinkedList<String>();
HashSet<String> hs = new HashSet<String>();
TreeSet<String> ts = new TreeSet<String>(new Comparator());
(TreeSet中,自定义比较器在接口声明后面也可以加<>来传入类型参数
class MyComparator inplements Comparator<String> )
同时在获取迭代器的时候,也应当在叠加器后加上尖括号<>,括号中声明与对应集合中相同的对象(元素)类型。
for example: ListIterator<String> li = al.listIterator();
ListIterator<String> li = ll.listIterator();
Iterator<String> it = hs.iterator();
Iterator<String> it = ts.Iterator();
在集合框架中,泛型比较常见,只要见到了<>就应当定义泛型, 其实<>及时用来接收类型的。
在使用集合的时候,将集合中要存储的引用数据类型作为参数传递到<>中即可。
好处1、将运行时期产生的ClassCastException,转移到了编译时期,使得程序员解决问题,让运行时期问题减少,安全。
好处2、避免了强制转换的麻烦。
二、自定义泛型类。
在我们自定义的类中,当类中要操作的引用数据类型不确定时,为了提高程序的扩展性,而进行的步骤。
在jdk1.5之前,我们使用Object类来提高程序的扩展性、
而现在,我们可以使用 泛型类 来提高程序的扩展性。
就是在定义的类名后面加<>,而括号中声明泛型。
for example: class Tool<T>
{
private T t;
public void setT(T t)
{
this.t = t;
}
}
在实例化该类对象时,在类名后面T处,指定该对象要操作的方法。
Tool<String> t = new Tool<String>();
三、自定义泛型方法。
泛型类定义的泛型,在整个类中有效,如果这个类型要被方法使用,那么泛型类的对象明确要操作的具体类型后,所有的要操作类型都已经固定了。
未了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛类型定义到方法上。定义位置呢在返回值前面
如: public <T> void show(T t){} : 之后能传入所有引用类型。
注: 静态方法不能访问类上定义的泛型, 如果静态方法操作的引用类型不确定,那么可以将泛型定义在方法上。
如: public static <T> void method(T t){} :之后能传入操作所有引用类型。
四、自定义泛型接口。
与泛型类相似, 例子: interface Inter <T> { void method(T t); }
其实现类,可以传入类型参数: class IntIple implements Inter<String> {public void method(String str){}}
也可以不传入参数: class IntIple<T> implements Inter<T> {public void method(T t){} }
五、泛型类的高级应用。
通配符: <?>,也可以理解为占位符,表示在此处应当传入的引用参数类型不确定。
泛型的限定:<? extends T> :表示该处可以传入类型T,或者T的子类型: 上限限定
<? super T> :表示该处可以传入类型T,或者T的父类型: 下限限定