封装之美——泛型

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

        泛型,是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<User> users=new ArrayList<User>();
User user=new User();
user.setName("张三");
list.add(user);

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

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

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

声明在类上:

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

        父类:Tree.java

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

        子类:Module和Organization

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

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

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

声明在接口/方法上:

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

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

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

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

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


  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值