浏览Guava库我在Files类的readLines方法中看到了这个奇怪的签名:
public static <T> T readLines(File file,
Charset charset,
LineProcessor<T> callback)
Run Code Online (Sandbox Code Playgroud)
我对Java中的泛型有点了解,但这让我感到困惑.
双T的含义是什么?为什么第一个用斜角括号?
更新:谢谢你的答案.我仍然不清楚为什么我应该在括号内使用T. 为什么例如它不能只是:
public static <> T readLines()
Run Code Online (Sandbox Code Playgroud)
要么
pulibc static <K> T readLines()
Run Code Online (Sandbox Code Playgroud)
或者java语法是否规定必须使用相同的字母?
现在这甚至更加严峻:
static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
Run Code Online (Sandbox Code Playgroud)
方法如何具有泛型返回类型并且无效?
它是一种通用方法 - T称为类型参数,可以表示任何类型.所以,如果我有一个带有此签名的方法:
public <T> T foo(T[] bar)
Run Code Online (Sandbox Code Playgroud)
我可以在任何数组上调用它,它将返回一个相同类型的单个对象.如果我传递一个String数组,我将返回一个String,依此类推.有关"通用方法"的Sun教程中的更多信息.
编辑: 在回答您更新的问题时,请记住第一个<T> 不是返回类型的一部分:它只是T一个类型参数的指示符.那么看看你引用的例子:
static <T> void fromArrayToCollection(T[] a, Collection<T> c)
Run Code Online (Sandbox Code Playgroud)
这只意味着fromArrayToCollection它将接受任何数组和任何集合,但它们必须是相同类型的数组和集合.所以你可以传入a String[]和a Collection<String>,或a Integer[]和a Collection<Integer>,但不是a String[]和a Collection<Integer>.无论你输入什么类型T,该方法都不会返回任何内容.
尖括号内的第一个T表示方法本身是通用的.第二个T是返回类型.T可以是其范围内的任何类型.在这种情况下,T没有界限.
T将在呼叫站点确定,在这种情况下,从LineProcessor <T>参数推断.
我仍然不清楚为什么我应该在括号内使用 T。例如为什么不能是:
Run Code Online (Sandbox Code Playgroud)public static <> T readLines()或者
Run Code Online (Sandbox Code Playgroud)public static <K> T readLines()或者java语法规定必须使用相同的字母?
or<T>是<K>类型参数。如果您编写<K> T,则 T 不是类型参数 - 相反,您正在使用特定的class T. 如果您没有T在范围内按字面命名的类,则这将不起作用。
现在这更奇怪了:
Run Code Online (Sandbox Code Playgroud)static <T> void fromArrayToCollection(T[] a, Collection<T> c) {一个方法怎么可能具有泛型返回类型并且为 void?
事实并非如此;这<T>不是“通用返回类型”,它只是方法的类型参数。您是说该方法是通用的,并且T是类型参数。该方法的返回类型是void。