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

用户2262955:

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

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

另一方面,我在声明中看到了类似的通用方法

public <E> void ...

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

谢谢

马特·麦克亨利(Matt McHenry):

E类型变量 -代表其他类型,例如StringInteger因此,就像您不了解dst.add(pop())不知道在何处和如何dst定义就无法理解一样,您也无法像popAll(Collection<E> dst)不了解类型变量在何处以及如何定义那样来理解方法声明E对于popAll,类型变量E是在类级别定义的Stack<E>::它是堆栈中元素的类型。您甚至会经常看到它是javadoc'd:

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

在另一方面,当你看到一个方法声明一样public <E> void ...,类型变量E声明(没有引用的一些封闭范围,如封闭类)。实际上,大多数情况下,当您看到一个具有自己的类型变量的方法时,它是一个静态方法,因此没有类的封闭实例来确定的值E

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

同样,以第136页的示例为例:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么有时在使用 Comparable 或其他接口时必须在尖括号中声明类类型?

为什么返回类型的静态泛型方法之前,需要类型参数

为什么带有泛型返回的此方法不能正确使用泛型类型?

当已经定义了所有类型时,为什么需要泛型?

在 Java 中初始化泛型类型时何时需要尖括号?

创建Java泛型类时,尖括号中的波浪号是什么意思?

泛型方法和泛型类型为什么会有不同类型的介绍语法?

为什么有时Rust会在泛型中的参数前放置::?

为什么泛型类型上的ToString()有方括号?

当用非泛型方法覆盖泛型方法时,为什么子签名和未经检查的规则在返回类型上以这种方式起作用?

在方法调用中省略括号

当未指定泛型类型时,为什么不返回基本类型?

返回类型之前泛型的目的是什么

如何在返回类型使用通配符从定义泛型类型有什么不同?

Kotlin Codelab:没有返回值,那么为什么返回泛型类型?

为什么在Ruby中有时需要加括号?

当我忽略泛型类型定义时,为什么打字稿不会抱怨?

为什么在声明使用泛型定义的结构的变量时必须添加类型?

泛型方法返回泛型类型

返回泛型类型的泛型方法

当未指定类型参数时,为什么Java泛型原始类会擦除对象的所有泛型?

泛型类中的方法不返回指定的类型。为什么?

为什么在 Rust 中 [有时] 不需要泛型的生命周期说明符?

为什么泛型 T 仅在具有约束时才被推断为文字类型?

有什么方法可以避免在使用泛型参数调用方法时进行类型转换?

从泛型类型继承时,为什么必须具有父类型限定才能使用嵌套类型?

为什么函数有时返回0,有时返回false?

为什么datetime对象有时返回日期,有时返回日期和时间?

为什么此Powershell函数有时返回列表,而有时返回XmlElement?