如何在Java编程中使用泛型?

在本文中,我们将讨论一种称为泛型的Java编程语言功能。泛型是JDK 5.0中引入的功能。泛型功能允许您抽象类型。这是什么意思?这意味着您可以创建一个可以为分配给它的类型工作的类或方法。使用Java集合时,您会看到泛型的大量使用。但是,当然可以将泛型用于程序中的其他操作。

为了说明此功能,让我们从在Java中尚无泛型时创建代码开始,以查看其试图解决的问题。

List data = new ArrayList();
data.add("John Doe");
String name = (String) data.get(0);

这是我们从上面的代码中可以看到的东西。首先,我们创建一个ArrayList并调用它data。该变量实际上可以在其中保存任何Java对象。在第二行,我们向此列表添加一个字符串。最后在第三行,我们从列表中获取数据。您在这里看到的一件事是,您需要转换从列表中读出的对象。因为列表除了之外都不知道要返回什么类型java.lang.Object。

如果查看JDK 5.0之前的Listadd()和get()方法的定义,您会看到该add()方法将接受Object作为参数,并且该get()方法也返回Object。

现在,假设您的朋友尝试使用您的课程,然后他尝试在列表中添加另一个对象。他添加了以下几行。

data.add(new Date());
String name = (String) data.get(0);

这段代码实际上可以很好地编译。该add()方法将有效,因为可Date扩展Object。并且该get()方法也将编译而没有任何错误。但是,当我们执行该程序时,将收到运行时错误消息,提示它无法将Date对象转换为的类型String。

Exception in thread "main" java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String

那么,如何保护您的朋友避免犯此错误呢?您可以使用泛型。您可以通过定义列表的类型来确定列表应存储的内容。这样,您将获得编译时检查,以确保将正确的数据添加到列表中。因此,您的代码将如下所示。

List<String> data = new ArrayList<String>();
data.add("John Doe");
String name = data.get(0);

在此代码段的通用版本中,您会看到现在我们声明了要存储类型为object的列表String。如果您尝试将a添加Date到列表中,则会出现编译时错误。您的IDE将把该行标记为错误。另一个好处是您不必再进行转换了。泛型通过从代码中删除不需要的强制转换运算符来减少代码中的混乱情况。

实际上,如果您正在使用JDK 7,则可以使用菱形运算符简化变量声明。所以你可以这样写。

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

我希望这将使您对泛型有基本的了解,以及如何在日常使用Java项目的过程中使用泛型。