虽然泛型技术还不是标准Java配置中一部分,但在称之为泛型Java (GJ)的第三方编译器中已经出现。GJ是开放资源Pizza编译器程序的子程序,它被用作Java 1.5中的泛模型。
可能用一个实例最容易解释泛型技术。在Java中,如果你要执行带有java.lang.String对象的java.util.List语句,那你要执行如下的代码:
...
// create a list and some string objects to it
List strings = new ArrayList();
strings.add("one");
strings.add("two");
strings.add("third string");
strings.add("and a fourth for good measure");
...
然后在你的程序中,你可能想将一个参数赋到一个字符串上,在这里foo是接受一个字符串对象为其唯一自变量的一种方式。
...
String s = (String) strings.get(0);
foo(s);
...
大多数Java开发者
大多数Java开发者都太习惯于这些代码,以至于他们不能发现一些潜在问题。这里有一个提示:是什么让你不能增加一个java.lang.Integer到你的列表中(如下):
strings.add(new Integer(5));
答案是:无。由集合容器接受并返回java.lang.Object,那就是为什么上面分配给“S”的行动指令需要分类整理。
你将不会意识到,你偶然在运行之前在你的列表中增加了一个java.lang.Integer代码,而在这段时间也正尝试将整数(Integer)赋给“s”。你可以通过记下你自己的列表类来解决这个问题,而这个类仅仅接受并返回字符串对象,但那将非常迅速。泛型技术则提供你想要的功能,并且没有新的代码——只有新的句型。
下面就是一个完整的文档,它描述了用泛型技术执行上面描述的片段:
import java.util.ArrayList;
public class GenericsTip {
public static void main(String args[]) {
ArrayList<String> strings = new ArrayList<String>();
strings.add("one");
strings.add("two");
strings.add("third string");
strings.add("and a fourth for good measure");
foo(strings.get(0));
}
public static void foo(String arg) {
System.out.println("arg: " + arg);
}
}
在两种操作之间最大的不同就是ArrayList对象字符串的使用。泛型技术语句是用来创建一个仅仅接受并返回字符串对象的列表,而不是创建一个接受和返回对象事件的ArrayList。
如果尝试在字符串对象列表中插入一个整数,将消除一个编译时间错误,如下:
GenericsTip.java:10: cannot resolve symbol
symbol : method add (java.lang.Integer)
location: class java.util.ArrayList<java.lang.String>
strings.add(new Integer(5));
^
用泛型技术创建列表可以不用作太多地强调就可以避免分类整理错误以及其他运行时间的潜在瓶颈。
编译以上的源文件需要GJ编译器。
