您的位置:首页 > 职场人生

黑马程序员——泛型

2015-07-08 22:49 411 查看
1.泛型的定义

泛型是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。方便将大量的类似的代码进行代码级别的优化。之所以要使用泛型,就是需要大量的使用容器类,原来的数组已经满足不了需求,

2.泛型使用场景

  泛型在java中,随处可见,比如在使用HashMap时,需要对数据的key与value类型进行定义,如果不适用泛型,则会定义多个HashMap的类型,代码的核心内容和思想是完全的相同,可能只是其中的需要处理的数据的类型不同。如果使用了泛型,则可以避免类似的问题。比如HashMap的定义如下:

public class HashMap<K,V>  extends AbstractMap<K,V>

    implements Map<K,V>, Cloneable, Serializable{.....}

通过HashMap的定义,在实例化时,如果你想key与value的类型是String,或者Int都可以,然后进行数据的put操作或者get操作。

在web代码的开发环境中,大量的实体类型存在添加、修改、删除和查询操作的,如果为每一个实体都写相同的操作,代码的冗余量非常大,如果使用泛型,则会在完成相同的功能的前提下,少写大量的代码,例如:添加,修改,删除的操作类使用了泛型的定义如下:

public class CommonDaoImpl<T> implements ICommonDao<T>{

public CommonDaoImpl() {

ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();// 获取泛型类型的参数类别

clazz = (Class<T>) type.getActualTypeArguments()[0];// 获取泛型参数的第一个参数

}

@Override

public Serializable save(T entity) {//数据的添加操作

Serializable id = this.getSession().save(entity);

return id;

}

 

}

以上的类和方法,完全是做了一些公共的操作方法,只需要在编写代码的过程中,将要操作的实体传过来,则会完成相应的操作,大大的减少了代码量,提高了工作效率。

3.泛型分类

泛型的的类别一般就是泛型类,泛型方法,泛型数组,但是,通常是不能直接定义泛型数组的,而是使用了java代码库中定义的如:List接口和其实现类来操作的。

1) 简单的泛型

泛型的定义非常的简单,在定义的类之后加上<T>,其中的T可以使任意的字符,如:public class BaseAction<T>{......}

2) 泛型接口

在java中,接口也可以使泛型的,将接口定义为泛型,实现类可以根据具体的实体去操作数据,如:java源代码中List对象的泛型定义如下:

public interface List<E> extends Collection<E>{

 Iterator<E> iterator();

 E set(int index, E element);

 ......

}

在泛型接口中定义以后,实现类可以根据自己的需要,然后传入实体对象,对数据进行操作。

3) 泛型方法

泛型方法使得该方法能偶独立于类而产生变化,如论何时,只要能够做到,就尽量的使用泛型方法,如果泛型方法可以取代将整个类泛型化,那就应该只是用泛型方法。要定义泛型方法,则需要将泛型参数列表至于返回值之前。如下面代码:

public   class  GenericMethod 

{  

   public  <T>  String  toString(T oT)  throws  SecurityException,  

            NoSuchMethodException, IllegalArgumentException,  

            IllegalAccessException, InvocationTargetException  

    {  

…………

}

}

只需要在方法中使用泛型,不需要在类中加入泛型的定义,同时也要将返回的泛型添加到返回值的前面。

4.泛型边界

边界使得你可以在泛型的参数上设置限制条件。比如你传入的参数必须是某一个类的子类,不继承自该类的就不能作为参数,则在泛型定义时就要进行限制,对于此种情况,定义如下:

public class Dog<? extends Animal>{.....}

此时,参数的对象必须继承对象Animal,才能够是正确的使用方式,保证类类型的安全

如果你的泛型的参数限制必须是某个类的父类或者某个类的下限,则可以使用如果的方式

public class SuperTypeWildcards<? super Apple>{

…………

}

泛型的边界可以保证你传入一个安全的对象到泛型类型中,从而确保传入的参数类型的安全。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: