在学习Java时,我遇到了泛型方法。
public <T> void foo(T variable) { }
这是一种采用未确定类型参数的方法(类似于PHP?)。然而,我无法看出这将是一个好的解决方案——特别是在从松散类型语言转换到强类型语言后,我已经爱上了强类型语言。
是否有使用通用方法的理由?如果有,什么时候使用?
java.util.Collection 包并查看源代码即可。
作为开发人员,我总是希望编译器在编译时捕获我的错误并在我想要编译它时通知我,然后我会修复我的错误,在运行时不会出现许多与类型安全相关的错误。
更多信息请参见:
List<T>
和List
在运行时没有任何区别,但是C#不会在编译时删除这些信息,您可以在运行时访问泛型信息,并且在C#中List<T>
与List
不同,如果您想编写支持通用和非通用用例的API,则应该将这些API编写两次。 - Mehdi泛型(Generics)是一种提供模板的方法,例如你想要做相同的事情,唯一不同之处就在于类型。
例如,看一下List API,你会看到方法
add(E e)
对于每个声明的相同类型的列表,add
方法唯一不同的地方就在于添加到列表中的元素的类型。这是泛型非常有用的一个典型例子。(在Java引入泛型之前,你可以声明一个列表,你可以向列表中添加任何东西,但是当你检索它时,你必须对对象进行强制转换)
更具体地说,你可能想要两个ArrayList实例,一个接受类型1,一个接受类型2。由于这两个列表都是ArrayList
实例,add
方法的列表代码将为每个列表执行相同的操作和代码,对吧?所以唯一不同的就是列表中的内容。
(正如@michael指出的那样,add
不是真正的泛型方法的例子,但是链接的API中有真正的泛型方法,概念是相同的)
一般而言,泛型函数并没有非强类型的特点。类型在编译时被解析和检查。它不是一个未决定的类型,而是一系列可能的类型之一(在您的示例中可以受到限制)。在编译时,它是已知和确定的。
正如hvgotcodes所说,集合API包含了许多这种用法的好例子。
要只保留String类型的对象,可以声明ArrayList的泛型版本如下:
ArrayList l = new ArrayList ();
java.util.Collections
(是一个类名,带有“s”)。 - Tom Hawtin - tacklinepublic <T> T foo(T variable) { }
总是返回相同类型的对象,而不是 任何 类型的对象。 - Goran Jovic