Java学习day053 泛型程序设计(为什么要使用泛型程序设计)(类型参数的好处、谁想成为泛型程序员)

使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。

day053   泛型程序设计(为什么要使用泛型程序设计)(类型参数的好处、谁想成为泛型程序员)

泛型程序设计(Generic programming)意味着编写的代码可以被很多不同类型的对象所重用。例如,我们并不希望为聚集String和File对象分别设计不同的类。实际上,也不需要这样做,因为一个ArrayList类可以聚集任何类型的对象。这是一个泛型程序设计的实例。


1.类型参数的好处

在Java中增加范型类之前,泛型程序设计是用继承实现的。ArrayList类只维护一个Object引用的数组:

public class ArrayList //before generic classes
{
    private Object[] elementData;
    public Object get(int i) { . . .}
    public void add(Object o) { . . . }
}

这种方法有两个问题。当获取一个值时必须进行强制类型转换。

ArrayList files=new ArrayList();
String filename=(String)files.get(O);

此外,这里没有错误检査。可以向数组列表中添加任何类的对象。

files.add(new File("..."));

对于这个调用,编译和运行都不会出错。然而在其他地方,如果将get的结果强制类型转换为String类型,就会产生一个错误。

泛型提供了一个更好的解决方案:类型参数(type parameters)。ArrayList类有一个类型参数用来指示元素的类型:

ArrayList<String> files=new ArrayList<String>():

这使得代码具有更好的可读性。人们一看就知道这个数组列表中包含的是String对象。

编译器也可以很好地利用这个信息。当调用get的时候,不需要进行强制类型转换,编译器就知道返回值类型为String,而不是Object:

String filename=files.get(0);

编译器还知道ArrayList<String>中add方法有一个类型为String的参数。这将比使用Object类型的参数安全一些。现在,编译器可以进行检査,避免插人错误类型的对象。例如:

files.add(new File("..."));//can only add String objects to an ArrayList

是无法通过编译的。出现编译错误比类在运行时出现类的强制类型转换异常要好得多。

类型参数的魅力在于:使得程序具有更好的可读性和安全性。


2.谁想成为泛型程序员

使用像ArrayList的泛型类很容易。大多数Java程序员都使用ArrayList<String>这样的类型,就好像它们已经构建在语言之中,像String[]数组一样。(当然,数组列表比数组要好一些,因为它可以自动扩展。)

但是,实现一个泛型类并没有那么容易。对于类型参数,使用这段代码的程序员可能想要内置(plug in)所有的类。他们希望在没有过多的限制以及混乱的错误消息的状态下,做所有的事情。因此,一个泛型程序员的任务就是预测出所用类的未来可能有的所有用途。

这一任务难到什么程度呢?下面是标准类库的设计者们肯定产生争议的一个典型问题。AirayList类有一个方法addAll用来添加另一个集合的全部元素。程序员可能想要将ArrayList<Manager>中的所有元素添加到ArrayList<Employee>中去。然而,反过来就不行了。如果只能允许前一个调用,而不能允许后一个调用呢?Java语言的设计者发明了一个具有独创性的新概念,通配符类型(wildcard type),它解决了这个问题。通配符类型非常抽象,然而,它们能让库的构建者编写出尽可能灵活的方法。

泛型程序设计划分为3个能力级别。基本级别是,仅仅使用泛型类—典型的是像ArrayList这样的集合—不必考虑它们的工作方式与原因。大多数应用程序员将会停留在这一级别上,直到出现了什么问题。当把不同的泛型类混合在一起时,或是在与对类型参数一无所知的遗留的代码进行衔接时,可能会看到含混不清的错误消息。如果这样的话,就需要学习Java泛型来系统地解决这些问题,而不要胡乱地猜测。当然,最终可能想要实现自己的泛型类与泛型方法。

应用程序员很可能不喜欢编写太多的泛型代码。JDK开发人员已经做出了很大的努力,为所有的集合类提供了类型参数。凭经验来说,那些原本涉及许多来自通用类型(如Object或Comparable接口)的强制类型转换的代码一定会因使用类型参数而受益。


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值