Java奇怪的泛型返回类型

And*_*yuk 5 java generics

浏览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)

方法如何具有泛型返回类型并且无效?

Eta*_*oin 9

它是一种通用方法 - 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,该方法都不会返回任何内容.


ILM*_*tan 7

尖括号内的第一个T表示方法本身是通用的.第二个T是返回类型.T可以是其范围内的任何类型.在这种情况下,T没有界限.

T将在呼叫站点确定,在这种情况下,从LineProcessor <T>参数推断.


Jes*_*per 4

我仍然不清楚为什么我应该在括号内使用 T。例如为什么不能是:

 public static <> T readLines()
Run Code Online (Sandbox Code Playgroud)

或者

 public static <K> T readLines()
Run Code Online (Sandbox Code Playgroud)

或者java语法规定必须使用相同的字母?

or<T><K>类型参数。如果您编写<K> T,则 T 不是类型参数 - 相反,您正在使用特定的class T. 如果您没有T在范围内按字面命名的类,则这将不起作用。

现在这更奇怪了:

static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
Run Code Online (Sandbox Code Playgroud)

一个方法怎么可能具有泛型返回类型并且为 void?

事实并非如此;这<T>不是“通用返回类型”,它只是方法的类型参数。您是说该方法是通用的,并且T是类型参数。该方法的返回类型是void