gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:16:11 26 4
gpt4 key购买 nike

我正在阅读有关泛型的 Effective Java 第 5 章,特别是关于首选泛型方法的项目。我注意到有时返回类型之前的方法声明中的类型参数(在尖括号之间)有时会被省略。像这样的例子还有很多,比如第二版第135页:

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

另一方面,我也看到过类似的带有声明的泛型方法

public <E> void ...

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

谢谢

最佳答案

E是一个类型变量——它代表一些其他类型,比如StringInteger .所以就像你看不懂dst.add(pop())不知道在哪里以及如何dst被定义,你无法理解像 popAll(Collection<E> dst) 这样的方法声明不知道类型变量在哪里以及如何E被定义为。在popAll的情况下, 类型变量 E在类级别定义:Stack<E> :它是堆栈中元素的类型。您甚至会经常看到它的 javadoc:

/**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 type 变量告诉我们 list 的元素类型必须匹配 f 的参数类型和 initVal 的类型.周边类没有定义E对我们来说,它只在 reduce 的范围内有意义方法声明。

关于java - 为什么在泛型方法的定义中有时会省略返回类型之前的尖括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25585581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com