Java泛型 - 更新

114 阅读3分钟

Java泛型功能是从Java 5开始添加到Java语言的。泛型为通用类和方法增加了一种指定具体类型的方法,这些方法以前是在Object 。这听起来有点抽象,所以我们将马上看一些使用集合的例子。

注意:除了集合类,Java泛型还可以用于其他类,但使用集合来展示Java泛型的基本原理是最容易的。

Java 泛型学教程

要了解Java泛型是如何全面工作的,你需要学习以下主题。

每一个主题都在自己的教程中有所涉及。本页的其余部分将向你介绍Java泛型,因此,在你继续阅读上述任何链接之前,阅读本介绍的其余部分可能会有帮助。

Java泛型的例子

List 接口表示一个Object 实例的列表。这意味着我们可以把任何对象放入一个List 。这里有一个例子。

List list = new ArrayList();

list.add(new Integer(2));
list.add("a String");

因为任何对象都可以被加入,所以你也必须对从这些对象中获得的任何对象进行铸造。比如说。

Integer integer = (Integer) list.get(0);

String string   = (String) list.get(1);

很多时候,你只用一个集合的单一类型。例如,你在集合中只保留String's或其他东西,而不是像我在上面的例子中那样混合类型。

利用Java泛型功能,你可以设置集合的类型来限制什么样的对象可以插入到集合中。此外,你不必对你从集合中获得的值进行铸造。下面是一个使用Java的泛型功能的例子。

List<String> strings = new ArrayList<String>();

strings.add("a String");

String aString = strings.get(0);

很好,对吗?

Java 7类型推理

Java泛型的特性在Java 7中得到了更新。从Java 7开始,Java编译器可以从集合被分配到的变量中推断出被实例化的集合的类型。下面是一个Java 7泛型的例子。

List<String> strings = new ArrayList<>();

注意到ArrayList 的泛型是如何被遗漏的。取而代之的是只写了<>。这有时也被称为钻石运算符。当你把钻石运算符写成泛型时,Java编译器会认为被实例化的类与它被分配的变量具有相同的类型。在上面的例子中,这意味着String ,因为List变量的类型被设定为String

循环的Java泛型

Java 5也有一个新的for-loop(也被称为 "for-each"),它能很好地与生成的集合一起工作。下面是一个例子。

List<String> strings = new ArrayList<String>();

//... add String instances to the strings list...

for(String aString : strings){
  System.out.println(aString);
}

这个for-each循环遍历保存在strings 列表中的所有String 实例。对于每一次迭代,下一个String 实例被分配到aString 变量中。这个for-loop比原始的while-loop要短,在原始的while-loop中,你会遍历集合Iterator,并调用Iterator.next() ,以获得下一个实例。

通用for循环(又称 "for each循环")在关于Java通用for循环的教程中有更详细的描述。

用于除集合以外的其他类型的Java泛型

当然,除了Java集合之外,也可以对其他类使用泛型。 你也可以对自己的类进行泛型。在你自己的类中使用Java泛型,在关于泛型类泛型方法使用类对象作为类型字面的教程中会有更详细的描述。