gpt4 book ai didi

java - 泛型类类型中的参数化方法

转载 作者:搜寻专家 更新时间:2023-10-31 20:04:36 25 4
gpt4 key购买 nike

我有一个相当简单的问题。虽然我无法通过搜索找到答案。

这两个代码片段有区别吗?有什么区别?

片段 1:

public class BinaryTree<T extends Comparable<? super T>> {
...
public <E extends T> void add(E value) {
...
}

public <E extends T> void add(E value, Node node) {
...
}
...
}

片段2:

public class BinaryTree<T extends Comparable<? super T>> {
...
public void add(T value) {
...
}

public void add(T value, Node node) {
...
}
...
}

Fragment1 明确指定参数value 必须是T 类型或T 类型的子类型。

Fragment2 指定参数value 必须是T 类型。但根据我的知识和经验,我认为我也可以在这里提供 T 的子类型。与 fragment1 相同。

我看了这两个片段的反汇编字节码。确实有区别:

<   public <E extends T> void add(E);
---
> public void add(T);

那只是反射(reflect)了源代码...

我只是不明白这个意思。而且我也找不到显示差异的示例应用程序。

感谢评论。

最佳答案

在这种情况下没有区别。让我们以 BinaryTree<Number> 为例并尝试添加 Integer :

BinaryTree<Number> numTree = new BinaryTree<>();
Integer i = 1;
numTree.add(i);

片段 1,E可能评估为 Integer ,但在这种情况下这是多余的。 Integer 是一个 Number , 你也可以指定 Number对于 E :

numTree.<Number>add(i);

出于这个原因,第二个代码片段与第一个代码片段没有什么不同,并且因为没有声明不必要的类型参数而减少了混淆。


在某些情况下,额外的类型参数会很有用。想象一下,由于某种原因你想返回传入的值:

public <E extends T> E add(E value) {
...
return value;
}

public <E extends T> E add(E value, Node node) {
...
return value;
}

这对调用者很有用:

Integer i2 = numTree.add(i);

第二个片段是不可能的,numTree.add只能返回 Number即使你传入了 Integer .

关于java - 泛型类类型中的参数化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12130940/

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