为何/何时应使用通用方法?

时间:2012-08-31 14:09:13

标签: java oop generics

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

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

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

有没有理由使用通用方法?如果是的话,何时?

4 个答案:

答案 0 :(得分:4)

泛型,除其他外,给你一个提供模板的方法 - 即你想做同样的事情,唯一的区别是类型。

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

add(E e)

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

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

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

答案 1 :(得分:4)

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

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

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

了解更多信息,请参阅:

答案 2 :(得分:1)

一般来说,没有关于泛型函数的非强类型。在编译时解析并检查类型。它不是一种未定型的类型,它是一系列可能类型中的一种(这些类型可以被约束,在您的示例中它们不是)。在编译时,它是已知的并且已经决定。

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

答案 3 :(得分:0)

通用概念的主要目标是:

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

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

  

ArrayList l = new ArrayList();

了解更多:UITableViewController