Java 奇怪的泛型返回类型

标签 java generics

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

相关文章:

swift - 是否可以向 Swift 协议(protocol)一致性扩展添加类型约束?

generics - Guice SPI : find bindings by wildcard types

java - 如何推断泛型类型以避免未经检查的转换

C# 泛型运算符

java - Java 中的缩写解码器脚本

java - Solr 和搜索运算符 - lucene apache solr

java - 如何修复sqlite中的 "no such column"

java - 为什么当我在 SQLite 中登录页面时我的页面自动关闭?

TypeScript——一些高级类型推断的问题;尝试为 Rematch 构建更好的类型

java - 基本属性类型不应该是 IDao - intellij 消息