[英]Java weird generic return type
浏览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语法是否规定必须使用相同的字母?
现在这甚至更加严峻:
static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
方法如何具有泛型返回类型并且无效?
它是一种通用方法 T
被称为类型参数 ,可以表示任何类型。 所以,如果我有一个带有此签名的方法:
public <T> T foo(T[] bar)
我可以在任何数组上调用它,它将返回一个相同类型的单个对象。 如果我传递一个String数组,我将返回一个String,依此类推。 有关“通用方法”的Sun教程中的更多信息。
编辑:在回答您更新的问题时,请记住第一个<T>
不是返回类型的一部分:它只是T
是类型参数的指示符。 那么看看你引用的例子:
static <T> void fromArrayToCollection(T[] a, Collection<T> c)
fromArrayToCollection
意味着fromArrayToCollection
将接受任何数组和任何集合, 但它们必须是相同类型的数组和集合。 因此,您可以传入String[]
和Collection<String>
,或者Integer[]
和Collection<Integer>
,但不能传递String[]
和Collection<Integer>
。 无论你输入什么类型的T
,该方法都不会返回任何内容。
尖括号内的第一个T表示方法本身是通用的。 第二个T是返回类型。 T可以是其范围内的任何类型。 在这种情况下,T没有界限。
T将在呼叫站点确定,在这种情况下,从LineProcessor <T>参数推断。
只有readLines方法使用泛型,而不是类级别的泛型。
<T>
声明方法使用的泛型类型 第一个使用与泛型类相同的语法来声明泛型类型。 相反,你可以写
class Generic <T>
{
public static T readLines(File file,
Charset charset,
LineProcessor<T> callback)
}
然而,这将使该类的所有实例都是通用的。
扩展示例:
public static <ElementType,ListType extends List<ElementType>> ListType add(ListType list,ElementType elem)
{
list.add(elem);
return list;
}
ArrayList<String> = add(add(new ArrayList<String>(),"Hello"),"World");
该方法将给定元素添加到List并返回List。
该方法对列表的元素使用两个通用类型1,对列表本身使用一个类型。
使用的名称没有什么特别,使用T作为泛型类型就像使用i作为整数。
该示例使用以下方法调用方法:
这将导致
public static ArrayList<String> add(ArrayList<String> list, String elem)
膨胀结束:-)
我仍然不清楚为什么我应该在括号内使用T. 为什么例如它不能只是:
public static <> T readLines()
要么
public static <K> T readLines()
或者java语法是否规定必须使用相同的字母?
<T>
或<K>
是类型参数。 如果你写<K> T
,那么T不是一个类型参数 - 而是你正在使用特定的class T
如果你没有一个在范围内命名为T
的类,这将不起作用。
现在这甚至更加严峻:
static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
方法如何具有泛型返回类型并且无效?
它没有; <T>
不是“泛型返回类型”,它只是方法的类型参数。 你说这个方法是通用的, T
是类型参数。 方法的返回类型void
。
这是一种通用方法。
实际上有三个Ts,第三个在LineProcessor<T>
使用该方法时指定T.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.