gpt4 book ai didi

java - 简单通配符使用误区

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:42 26 4
gpt4 key购买 nike

我正在研究通配符,我以一种非常简单的方式理解它们。 <? extends Type>当我仅使用它们来读取(Returntype)和 <? super Type> 时当我使用它来编写(参数类型)时

interface P<T> {
boolean eval(T e);
}

public class IsZero implements P<Integer> {
public boolean eval(Integer e) {
return e.intValue() == 0;
}
}

public class QQ<T> {
public void filter(Q<T> q1, Q<T> q2, P<T> p) {
while (!q2.isEmpty()) {
T tmp = q2.remove();
if (p.eval(tmp)) {
q1.add(tmp);
}
}
}
}

所以,给出了这段代码。我的教授写了以下解决方案:

/*
Q<? super T> q1 just used as a Parametertype for writing (add)
Q<? extends T> q2 just used as a Returntype for reading (remove)
P<? super T> p just used as Parametertype (eval)
*/

我同意这一点,但我不明白为什么它是 P<? super T>因为 eval 返回一个 boolean 值?或者我把整个返回/参数都搞错了?

最佳答案

p 和 q1 需要是 Q<? super T>出于同样的原因...因为两者都需要能够处理 T 的任何实例,并且如果您能够处理 T 或其任何父类(super class),那么您在这方面就很擅长。所以将其设置为 Q<? super T> 的原因而不是Q<T>就是让你的代码尽可能通用。

另一种说法... if X > Y意味着 X 是 Y 的父类(super class)/接口(interface)或Y本身和 p 是 Q<A> ,q1 是 Q<B> q2 是 Q<C>

上述约束条件表明 A > CB > C不管 A 之间有什么关系和B ;如果它们中至少有一个是接口(interface),则它们可能根本不相关。

方法调用是否要修改主题并不重要。

顺便说一句,在大多数 Java 标准集合类中 add还返回一个 boolean 值来指示该操作是否更改了大多数时候被忽略的集合。所以这根本不相关。

关于java - 简单通配符使用误区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43095729/

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