5

学习Java,我遇到了泛型方法

public <T> void foo(T variable) { }

也就是说,一个方法接受一个未确定类型的参数(á la PHP?)。然而,我无法看到这将是一个好的解决方案 - 特别是因为我在从松散的语言中爱上了强类型语言之后。

有什么理由使用泛型方法吗?如果有,什么时候?

4

4 回答 4

4

那些来自 Java 5 背景之前的人都知道,将对象存储在 Collection 中,然后在使用它之前将其转换回正确的 Type 是多么不方便。泛型可以防止这些。它提供编译时类型安全,并确保您只在集合中插入正确的类型,并避免在运行时出现 ClassCastException。

所以它提供了编译时类型安全和强制转换。当您想要编写具有复杂方法签名的复杂 API 时,它会在编写 API 和使用 API 时为您节省很多时间,并且可以防止编写大量代码来转换部分并在编译时捕获错误。只需看一下java.util.Collection包并查看源代码。

作为开发人员,我总是希望编译器在编译时捕获我的错误,并在我想要编译它时通知我,然后我将修复我的错误,并且在运行时不会有很多与类型安全相关的错误。

欲了解更多信息,请参阅:

于 2012-08-31T14:32:49.823 回答
3

除其他外,泛型为您提供了一种提供模板的方法——即您想做同样的事情,唯一的区别是类型。

例如,查看List API,您将看到方法

add(E e)

对于您声明的每个相同类型的列表,方法的唯一不同之处add在于进入列表的事物的类型。这是泛型有用的一个主要例子。(在将泛型引入 Java 之前,您将声明一个列表,并且您可以将任何内容添加到列表中,但您必须在检索对象时强制转换它)

更具体地说,您可能需要 2 个 ArrayList 实例,一个采用 type1,一个采用 type2。add对于每个列表(因为两个列表都是ArrayList实例),列表代码将执行相同的操作,执行相同的代码,对吗?所以唯一不同的是列表中的内容。

(正如@michael 指出的那样,add不是泛型方法的真实示例,但链接的API 中有真正的泛型方法,并且概念是相同的)

于 2012-08-31T14:11:24.493 回答
1

一般来说,泛型函数没有什么非强类型的。类型在编译时被解析和检查。它不是未定类型,它是一系列可能的类型之一(这些类型可以受到限制,在您的示例中它们不是)。在编译时它是已知和决定的。

正如 hvgotcodes 所说,Collections API 包含许多很好的使用示例。

于 2012-08-31T14:15:30.577 回答
0

通用概念的主要目标是:

  • 为集合提供类型安全,以便它们只能保存一种特定类型的对象。
  • 解决类型转换问题。

要仅保存 String 类型的对象,可以声明 ArrayList 的通用版本,如下所示:

ArrayList l = new ArrayList ();

要了解更多信息: http: //algovalley.com/java/generics.php

于 2016-03-26T19:00:18.970 回答