欢迎来到论文网! 识人者智,自知者明,通过生日认识自己! 生日公历:
网站地图 | Tags标签 | RSS
论文网 论文网8200余万篇毕业论文、各种论文格式和论文范文以及9千多种期刊杂志的论文征稿及论文投稿信息,是论文写作、论文投稿和论文发表的论文参考网站,也是科研人员论文检测和发表论文的理想平台。lunwenf@yeah.net。
您当前的位置:首页 > 科技论文 > 计算机论文

泛型及其应用

时间:2011-04-23  作者:秩名

论文导读:Java是当今时代很流行的开发语言,泛型是在JDK5.0中提出来的,泛型为开发者提供了一种高性能的编程方式,能够提高代码的重用性,并允许开发者编写非常优雅的解决方案。那么什么是泛型,如何来使用泛型呢?下面就为什么需要泛型和泛型的应用进行论述说明。
关键词:泛型,应用
 

Java是当今时代很流行的开发语言,泛型是在JDK5.0中提出来的,泛型为开发者提供了一种高性能的编程方式,能够提高代码的重用性,并允许开发者编写非常优雅的解决方案。本文将围绕泛型的相关知识进行论述。

关键词

Java 泛型新特性

引言

泛型为开发者提供了一种高性能的编程方式,能够提高代码的重用性,可以使用它来增大Java类型系统。那么什么是泛型,如何来使用泛型呢?下面就为什么需要泛型和泛型的应用进行论述说明。

为什么需要泛型

在JDK1.5以前,我们在编写Java程序的时候,有一个很容易引起问题的地方:我们经常需要不断地进行向下转型操作,将某个对象向下造型成更加具体的对象,例如,我们从集合中取出对象的时候,它的类型是Object类型,为了正确使用从中取出的这些对象,我们必须对它们进行向下造型,让它们“显示出庐山真面目”,这样我们才可以正确的调用这些对象上的方法。我们来看下面这个代码片段:

Hashtablestudents = new Hashtable();

students.put(newInteger(100),”张三”);

Stringname = (String)students.get(new Integer(100));

System.out.println(name);

这个代码片段中,我们首先将一个String类型数据放到了Hashtable中,而当我们从中取出它的时候,因为get()方法返回的是一个Object类型的对象,所以要正确的使用它,我们必须先将取出来的结果进行向下造型。这不仅使得我们的代码变得冗余,而且很容易就会出现造型异常(ClassCastException)。

在JDK5.0中,提供了类似于C++中的模板概念的“泛型”,即所谓的Generictype或者generice,可以使用它来增大Java类型系统。可以将泛型类型看做是类型“函数” :它们通过类型变量进行参数化,这些类型变量可以根据上下文用各种类型参数进行实例化。

使用泛型

在JDK5.0中,所有的集合类都使用泛型进行了重写,使得这些集合类均支持泛型。如果使用泛型,可以将上面的代码改为如下的格式

Hashtable<Integer,String> students = newHashtable<Integer,String>();

students.put(newInteger(100),”张三”);

Stringname = students.get(new Integer(100));

System.out.println(name);

通过这种方式,就解决了上面提到的进行造型的问题。

为什么Hashtable可以使用这种方式来存期数据呢?这是因为,在JDK5.0中,所有的集合类都实现了泛型,例如,Hashtable的定义如下:

public classHashtable<K,V>

{

//…

Enumeration<V>elements(){

//…

}

V get(Object o){

//…

}

Enumeration<V>keys(){

//…

}

Void put(K key,Vvalue){

//…

}

V remove(Objectkey){

//…

}

//…

}

其实,在某种程度上可以将泛型理解成“占位符”:在定义的地方,用一个”<K>”来表示某个值,这个值的类型未知(当然值也是未知),而在后面所有用到”<K>”的地方,表示的都是和前面定义的地方表示的是同一个东西。

泛型应用

除了JDK中泛型化了的相关类外,我们也可以自己定义一个泛型类型,下面我们来看一个例子。

源代码:MyGenerics.java

publicclass MyGenerics<T>

{

privateT filed;

publicvoid setField(T f)

{

this.field = f;

//获得f的类型

System.out.println(f.getClass());

}

public T getField()

{

returnthis.field;

}

}

在这里我们定义了一个泛型类MyGenerics,用<T>来声明了一个类型参数,然后,在类中定义了一个T类型的属性field,并且定义了相应的setter/getter方法,在setField()方法中,我们使用getClass()方法将f的类型取出来,它将返回一个Class类型的对象,表示f所对应的类。然后我们就可以在程序中使用这个泛型类了。

源代码:TestGenerics.java

public class TestGenerics

{

public static void main(String[] args)

{

MyGenerics<String> g1 = newMyGenerics<String>();

g1.setField(“Hello”);

MyGenerics<Integer> g2 = newMyGenerics<Integer>();

//这里用到了自动装箱

g2.setField(200);

}

}

在这个程序中,我们首先定义了一个MyGenerics<String>类型的变量g1,然后调用setField() 方法,并且传递给它一个String类型的参数,因此此处相当于调用了一个setField(Strings)的方法。然后我们又定义了一个MyGenerics<Integer>类型的变量g2,并且在这个对象上调用了setField()方法,此处用到了JDK5.0中新增的自动装箱的功能,相当于调用了一个setField(Integeri)的方法。编译并运行这个程序,可以得到如下的输出:

classjava.lang.String

classjava.lang.Integer

通过泛型,我们可以方便的定义一个类,让它能够适应不同类型的数据,但是,和使用Object类型作为参数不一样的是,在进行操作的时候,可以不用考虑造型的问题。但是需要注意的是,在上面的程序TestGenerics.java中,虽然g1和g2类型好像来自同一个类(MyGenerics<T>),但是,实际上它们的类型是不同的,也就是说,不能使用“g1=g2;“的方式来相互赋值,否则,将会发生类型不匹配的错误。


参考文献
1. (美)特尼博姆 等著;辛春生 等译《分布式系统原理与范型(第2版)》
清华大学出版社
2.《Java学习笔记》良葛格著;清华大学出版社出版
 

 

查看相关论文专题
加入收藏  打印本文
上一篇论文:多功能电子记事本的研究
下一篇论文:访问ASP.NET母版页的三种常用方法
科技论文分类
科技小论文 数学建模论文
数学论文 节能减排论文
数学小论文 低碳生活论文
物理论文 建筑工程论文
网站设计论文 农业论文
图书情报 环境保护论文
计算机论文 化学论文
机电一体化论文 生物论文
网络安全论文 机械论文
水利论文 地质论文
交通论文
相关计算机论文
最新计算机论文
读者推荐的计算机论文