我正在阅读Java here和here中的泛型,虽然我理解拥有它们的重点,但我在理解通用Java方法的标题时遇到了一些麻烦。我习惯了:
public returnType methodName(parameters){body}
令我困惑的是通用方法声明的规范:
public *genericType* returnType methodName(parameters){body}
或
public static <T> void fromArrayToCollection(Collection<T> c) {}
这种类型声明(静态和无效之间的<T>
)有什么影响?它只是概述了方法参数的类型吗?
答案 0 :(得分:4)
在这种情况下,<T>
和static
之间的void
表示“此方法中有一个泛型类型参数被称为T
。”
比较案例1:
class Foo<T> {
public void doFoo(Collection<T> items) ...
}
案例2:
class Foo {
public <T> void doFoo(Collection<T> items) ...
}
和案例3:
class Foo {
public void doFoo(Collection<T> items) ...
}
在第一种情况下,T
是整个类的泛型类型,因此如果您调用doFoo
,则传入的集合中的<T>
必须相同{ {1}}作为T
实例的泛型类型。
在第二种情况下,Foo<T>
是仅在方法T
中存在的泛型类型。
在案例3中,doFoo
必须是实际类型,因为没有声明它是泛型类型参数。
答案 1 :(得分:2)
声明为返回类型的<T>
引用参数中声明的<T>
。这样你就知道如果你给你的方法提供一个字符串集合,你就会得到一个字符串。
总而言之,泛型类型使您能够在代码中引用类型而无需指定它。