诊断Java代码: 轻松掌握Java泛型[Java编程]
本文“诊断Java代码: 轻松掌握Java泛型[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
J2SE 1.5 - 代号为 Tiger - 筹划在 2003 年年底公布.我一向都热衷于尽大概多地汇集有关行将推出的新技术的预告信息,因此我将撰写一系列的文章,谈论可从 V1.5 中得到的新的和经太重组的特点,本文是第一篇.我分外想谈谈泛型范例并重点报告在 Tiger 中为了支持它们而举行的更改和调整.
在很多方面,Tiger 必定是迄今为止在 Java 编程方面(包含对源语言语法的庞大扩大)所获得的最大进步.Tiger 中筹划举行的最明显的改变是增添泛型范例,正如在 JSR-14 原型编译器中所预先展示的那样(您可以当即免费下载该编译器;请参阅 参考资料).
让我们从介绍泛型范例是什么以及增添了什么特点来支持它们开始吧.
数据范例转换和错误
为理解泛型范例为什么如此有效,我们要将注意力转向 Java 语言中最简单引发错误的因素之一 - 需求不断地将表达式向下范例转换(downcast)为比其静态范例更为具体的数据范例(请参阅 参考资猜中的“The Double Descent bug pattern”,以理解举行数据范例转换时,大概会碰到的麻烦的某些方面).
程序中的每个向下范例转换关于 ClassCastException 而言都是潜在的危险,该当尽大概避免它们.但是在 Java 语言中它们普通是无法避免的,即便在计划优异的程序中也是如此.
在 Java 语言中举行向下范例转换最常见的缘由在于,常常以专用的方法来利用类,这限制了办法调用所返回的参数大概的运行时范例.比方,假定往 Hashtable 中增添元素并从中检索元素.那么在给定的程序中,被用作键的元素范例和存储在散列表中的值范例,将不能是肆意对象.普通,全部的键都是某一特定范例的实例.一样地,存储的值将共同具有比 Object 更具体的大众范例.
但是在目前现有的 Java 语言版本中,不大概将散列表的特定键和元素声明为比 Object 更具体的范例.在散列表上履行插入和检索操作的范例特点符奉告我们只能插入和删除肆意对象.比方, put 和 get 操作的阐明以下所示:
清单 1. 插入/检索范例阐明表明只能是肆意对象
class Hashtable {
Object put(Object key, Object value) {...}
Object get(Object key) {...}
...
}
因此,当我们从类 Hashtable 的实例检索元素时,比方,即便我们知道在 Hashtable 中只放了 String ,而范例系统也只知道所检索的值是 Object 范例.在对检索到的值举行任何特定于 String 的操作之前,必须将它强迫转换为 String ,即便是将检索到的元素增添到同一代码块中,也是如此!
清单 2. 将检索到的值强迫转换成 String
import java.util.Hashtable;
class Test {
public static void main(String[] args) {
Hashtable h = new Hashtable();
h.put(new Integer(0), "value");
String s = (String)h.get(new Integer(0));
System.out.println(s);
}
}
请注意 main 办法主体部份的第三行中需求举行的数据范例转换.因为 Java 范例系统相当柔弱,因此代码会因象上面那样的数据范例转换而漏洞百出.这些数据范例转换不但使 Java 代码变得越发拖沓冗长,并且它们还降低了静态范例查抄的代价(因为每个数据范例转换都是一个挑选忽视静态范例查抄的伪指令).我们该若何扩大该范例系统,从而没必要躲避它呢?
以上是“诊断Java代码: 轻松掌握Java泛型[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |