封装之美――泛型

2014-11-24 03:22:05 · 作者: · 浏览: 0

什么是泛型呢?我们来看一下百度百科是怎样说的吧:

泛型,是jdk1.5引入的新特性。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛类型、泛型接口、泛型方法。

那么为什么Java会引入泛型呢?

最初Java语言引入泛型的好处是安全简单,因为大家知道在使用容器,例如List的时候,往List里面add的是一个Object类型,那么添加的是不是所需要的类型在编译阶段是不知道的。如下:

List users=new ArrayList();
User user=new User();
user.setName("张三");
list.add(user);

如果我添加的不是一个User类型的,那么编译是不会有问题的,但运行时肯定就会出错了。jdk1.5引入泛型后,List的写法发生了改变,那就是加入了泛型,这样就可以在编译阶段及时的发现问题。如下:

List
  
    users=new ArrayList
   
    (); User user=new User(); user.setName("张三"); list.add(user);
   
  

若往List中添加的不是一个User实例,那么就会报错。

如果说泛型只有这么一点功能,那么就太小看sun公司了。

开头也说了,泛型可以声明到类、接口、方法的创建上面去,那么分别举例说明这三种(其实个人更愿意说两种):

声明在类上:

上篇封装之美说到parent和children没法封到父类里面去,这里就来看一下怎样提到父类里面:

父类:Tree.java

public class Tree
  
    {
	private String id;
	private String name;
	private T parent;
	private String pid;
	private List
   
    children; private boolean isleaf; }
   
  

子类:Module和Organization

public class Organization extends Tree
  
    {
	private String description;
}
public class Module extends Tree
   
    { private String url; private String description; private String sn; }
   
  

这样在Module的实例中getParent就是一个Module的实例,在Organization实例中getParent就是一个Organization,而如果不采用泛型,那么这个只能声明到子类中,或者在父类中声明Tree(这样的话会存在问题)。

这种情况的使用就是每个类都会使用自己这个类型,那么就声明一个带有泛型的父类,在继承的时候确定变量的类型。

声明在接口/方法上:

这种方式的使用吧,个人感觉是把类型当作一个参数,在编译时再确定,举个例子,大家自己参悟一下吧:

接口:
  
    T get(Class
   
     entityClass, Object pk); 实现: public 
    
      T get(Class
     
       entityClass, Object pk) { T obj = em.find(entityClass, pk); return obj; } 方法调用: User user=get(User.class,"001");
     
    
   
  

不知看明白了没有,在声明方法和接口的时候,参数和返回值等都是声明的泛型,在调用的时候这个参数类型和返回值类型才会被确定,这样做的好处是方法的声明更加具有通用性。

但是仅仅靠这一个就能实现通用性么?上面那个方法其实是调用的EJB的EntityManager的方法,如果不是调用这个方法,而是还有别的操作,那么该怎么办呢?

这里只是给大家点一下,反射,就是java.lang.reflect包下的那些个东西。泛型加反射也是最近才稍微多的接触了一点点,用的也不是特别好,但却已经很真实的感觉到其对于编程带来的方便,点赞一下~~