【问题标题】:What does <T> before the return type of a method mean?方法返回类型前的 <T> 是什么意思?
【发布时间】:2020-01-31 19:48:56
【问题描述】:

以下方法返回一个由T类型元素组成的List:

public <T> List<T> getList() {
    return new ArrayList<T>();
}

在签名中我们有&lt;T&gt; List&lt;T&gt;List&lt;T&gt; 是有意义的,因为那是 返回值 的类型。不过前面的&lt;T&gt; 有什么需要呢?

如果没有&lt;T&gt;List&lt;T&gt;,代码将无法编译。省略&lt;T&gt; 给出

无法解析符号 T


我已阅读generic methods 上的 Oracle 官方教程。它解释了这是语法的一部分:

泛型方法的语法包括类型参数列表,位于尖括号内,出现在方法的返回类型之前。

但它并没有真正解释为什么首先需要它或它对方法的确切影响。

【问题讨论】:

  • &lt;T&gt; 是一个泛型类型参数。这表明这是一个通用方法。否则没有迹象表明 T 应该是什么。
  • 第一个 表示这是一个泛型方法。第二个 是返回类型 List 的一部分,表示该方法返回泛型类型参数的列表。请注意,第一个 不是返回类型的一部分。你也可以有一个 void sendTheList(List theList) 方法
  • @GonenI 你是对的。如果没有 ,我无法编译 sendTheList。但是知道为什么编译器不能简单地从没有额外的 的返回或参数泛型类型中推断出类型吗?或者您可以指出我的任何进一步阅读?
  • @Zabuza 关于“您本可以发布该链接,然后解释它为什么没有回答您的问题” - 感谢您的解释。你是对的,我以后会记住这一点。我已经删除了我对编辑的评论,因为最新的编辑使帖子更加清晰。

标签: java generics generic-method


【解决方案1】:

第一个&lt;T&gt; 表示第二个T 是通用参数的占位符,而不是您要存储在该列表中的类的实际名称。

如果没有第一个&lt;T&gt;,编译器会将T 视为类名(如ObjectString 等)尝试在具有该方法的类所在的同一包中找到名为T 的类存在或在具有该方法的类的导入部分中。如果编译器无法找到名为T 的类,则会显示编译错误。

【讨论】:

  • 谢谢,这是有道理的。还解释了为什么没有 &lt;T&gt; 我会收到一条错误消息“无法解析符号 T”
  • 感谢您的回答!完美。
猜你喜欢
  • 2014-11-07
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2017-12-03
相关资源
最近更新 更多