------- android培训、java培训、期待与您交流! ----------
泛型:JDK1.5后出现的新特性。用于解决安全问题,是一个类型安全机制。
数组在定义的时候就明确了类型,所以数组比较安全。
集合定义要明确类型:如:
ArrayList <String> al=new ArrayList<String>();
Iterator<String> it=al.iterator();
泛型的出现:
1.将运行时期出现的问题ClassCastException,转移到了编译时期,方便于程序员解决问题,让运行时期的问题减少;
2.避免了强制转换的麻烦
泛型格式:通过<>来定义要操作的引用数据类型。
理解:和代码int x=9;的x一样,代码ArrayList <T> al=new ArrayList<T>();中的T也是一个变量,只不过,x是整形变量,T为类型变量(String,Integer,Long等等)
泛型常见于集合框架中。例:
class MyComparator implements Comparator<String>{
public int compare(String s1,String s2){}
}
Comparable中也有泛型,Object类中的equal()方法则不能有泛型的定义(如果定义了就不是覆盖此方法了)。
自定义泛型类:其实也不复杂,将QQ看成任意类型就行,直观点就看成String,然后Integer也能用,注意上面的理解。
class Utils<QQ>{
private QQ q;
public void setObject(QQ q){
this.q=q;
}
public QQ getObject(){
return q;
}
}
自定义泛型方法:
class Utils{
public <T> void show(T t){
...}
public <Q> void show(Q q){
...}
}
在类中定义一个泛型,在方法中还可以定义另一个泛型。
特殊:静态方法不能访问类上定义的泛型,但可以定义在静态方法上:
public static <W> void method(W w){
//注意<W>要定义在返回值之前,修饰符之后
}
自定义泛型接口:
interface Inter<T>{
...}
class InterImpl<T> implements Inter<T>//还未实现泛型
class InterImpl implements Inter<String>//已指定泛型
泛型的高级应用:
<?>:问号为通配符,指任意类型,与<T>相同。
<? extends E>:可以接收E类型或E的子类型。E为上限
<? super E>:可以接收E类型或E的父类型。E为下限
重点理解下限(比较难理解):
TreeSet(Comparator(? super E) comparator)
如:有一个父类Person,两子类:Student和Worker,定义一个比较器将他们各自的元素排序,其中比较器:
class PersonComp implements Comparator<Person>
class StudentComp implements Comparator<Student>
class WorkerComp implements Comparator<Worker>
比较器 比较器接口 泛型类
如果要排序用的方法一样,就不用按上面那样各自定义一个比较器,直接定义第一个PersonComp(即两泛型类的父类比较器),然后另两个子类在TreeSet传元素的时候,先构造一个TreeSet,然后将PersonComp直接放入即可。