浏览Guava我在 Files 类的 readLines 方法上看到了这个奇怪的签名:
public static <T> T readLines(File file,
Charset charset,
LineProcessor<T> callback)
我对 Java 中的泛型了解一点,但这让我感到困惑。
这里的双T是什么意思?为什么第一个在尖括号中?
更新:感谢您的回答。我仍然不清楚为什么要在括号内使用 T。为什么不能只是这样:
public static <> T readLines()
或
pulibc static <K> T readLines()
或者 java 语法是否规定必须使用相同的字母?
现在this甚至更奇怪:
static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
一个方法怎么可能有泛型返回类型并且是无效的?
最佳答案
这是一个通用方法 -- T
称为类型参数,可以表示任何类型。所以如果我有一个带有这个签名的方法:
public <T> T foo(T[] bar)
我可以在任何数组上调用它,它会返回一个相同类型的对象。如果我向它传递一个字符串数组,我将取回一个字符串,依此类推。更多信息 in the Sun tutorials for "generic methods".
编辑:在回答您更新的问题时,请记住第一个 <T>
不是返回类型的一部分:它只是一个指示器 T
是一个类型参数。所以看看你引用的例子:
static <T> void fromArrayToCollection(T[] a, Collection<T> c)
这就意味着 fromArrayToCollection
将接受任何数组和任何集合,但是它们必须是相同类型的数组和集合。所以你可以传入 String[]
和一个 Collection<String>
,或 Integer[]
和一个 Collection<Integer>
, 但不是 String[]
和一个 Collection<Integer>
. T
无论你输入什么类型, 该方法不返回任何内容。
关于Java 奇怪的泛型返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2877001/