当前位置: 首页 > 知识库问答 >
问题:

为什么泛型方法的定义中有时会省略返回类型前的尖括号

西门安歌
2023-03-14

我正在阅读《有效Java》第5章关于泛型的内容,特别是关于偏好泛型方法的内容。我注意到,有时返回类型之前的方法声明中的类型参数(尖括号之间)会被省略。类似的案例有很多,但例如第二版第135页:

public void popAll(Collection<E> dst) {
while (!isEmpty())
dst.add(pop());
} 

另一方面,我看到了类似的泛型方法与声明

public <E> void ...

第一个是错别字吗?如果不是,我什么时候可以省略声明中的括号?

谢啦

共有3个答案

伍皓
2023-03-14
匿名用户

答案是…不是。“泛型方法”被定义为在返回类型之前声明类型变量的方法:

如果方法声明了一个或多个类型变量,则它是泛型的。(JLS 8.4.4)

因此,popAll不是“泛型方法”。

因为该方法不声明类型参数< code>E,所以必须在封闭范围内定义它;几乎可以肯定是包含该方法的类(“泛型类”)。

戎志勇
2023-03-14

不同之处在于,在第一种情况下,整个类被声明为泛型,而在第二种情况下,只有方法是泛型的。

苗盛
2023-03-14

E是一个类型变量——它代表其他类型,如String整数。所以就像你不能理解dst.add(op())而不知道dst是在哪里以及如何定义的一样,你也不能理解像PopAll(集合

/**A Stack of elements
  *
  *@param E The type of elements in the stack */
public class Stack<E>{
    public void popAll(Collection<E> dst){ ... }
}

另一方面,当您看到像公共这样的方法声明时

在这两种情况下,E类型变量在做什么?它告诉我们两种不同的类型必须如何相互关联。在PopAll中,它告诉我们要将弹出的元素放入集合的元素类型必须与弹出它们的堆栈的元素类型相匹配。

类似地,以第136页的示例为例:

public class ListUtils{
    public static <E> E reduce(List<E> list, Function<E> f, E initVal);
}

这里,Etype变量告诉我们list的元素类型必须与f参数类型和initVal的类型相匹配。周围的类没有为我们定义E,它只在减少方法声明的范围内有意义。

 类似资料:
  • 下面对getHighest()和getLowest()的调用返回Comparable类型的对象,而不是T类型的对象,这正是我们想要的。为什么,我该如何改进这段代码,使这些调用返回T(这样T的字段和方法就可用了)? 下一行生成编译器错误: 错误:找不到符号符号:方法getName()位置:接口java.lang.Comparable 我想employee.getHighest()返回一个员工(而不仅

  • 问题内容: 为什么以下代码会编译?该方法返回该类型或其子类的实例。类中的代码调用该方法。编译器允许将返回值存储到类型的变量(显然不在的层次结构中)。 即使在擦除类型之后, 返回类型也不应该仍然是的实例 吗? 该方法的字节码为: 编辑:一致地替换为。 问题答案: 这实际上是合法的类型推断*。 我们可以将其简化为以下示例(Ideone): 因为是接口,所以允许编译器推断(无意义的,实际上是)交集类型。

  • 问题内容: 例如,在以下代码中 返回类型之前的目的是什么(该行的作用或如何读取) 问题答案: 这是使您的 方法 (而不是 类 )通用的语法。 常规类和泛型类的方法可以根据其自身的类型参数进行泛型。在这种情况下,您的方法是on的通用方法,它必须是从扩展的类型。

  • Java中是否有一种方法可以通过一个方法的声明返回不同的类型? 我希望此方法返回一个对象,并在函数调用时将其转换为正确的类型。这就是我的想法,但它不是这样工作的。我是否需要某种通用返回类型来执行此操作?解决这个问题的最佳方法是什么?

  • 问题内容: 背景 我曾经写过这种方法: 应该这样称呼它: 这很好用(尽管我在研究当前容易出错的问题时在这里的答案中已经看到)。 目前的情况 无论如何,现在我正在编写以下代码(在扩展javax.servlet.jsp.tagext.TagSupport的类中): 目的是可以这样称呼: 我的评估方法中的代码显然不起作用。的第二个参数应该是Class对象。这导致我: 我的问题 如何获得通用(返回)类型的

  • 在研究泛型时,我注意到泛型方法和泛型类型(类或接口)在类型引入语法上的一个差异使我感到困惑。 泛型方法的语法为 文件上说 为了彼此保持一致,我希望方法语法为 ,或者类型语法(for class)为,但事实显然并非如此。 为什么一个要介绍在前,另一个要介绍在后? 我主要以的形式使用泛型,并认为可能看起来很奇怪,但这是一个主观的参数,此外对于方法也是这样。您可以调用,类似于 在寻找技术解释时,我想在指