繁体   English   中英

Java奇怪的泛型返回类型

[英]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>声明方法使用的泛型类型
  • 以下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作为整数。

  • ElementType是用于通用元素类型的名称(可以使用任何有效的变量名称/标识符)
  • ListType是通用列表Type的名称,使用的类必须为ElementType扩展/实现List。

该示例使用以下方法调用方法:

  • ElementType = String
  • ListType = ArrayList

这将导致
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM