gpt4 book ai didi

java - 下界通配符(Comparable)

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

在集合中转换为 Comparable经常使用接口(interface),例如。在 PriorityQueue :

private static <T> void siftUpComparable(int k, T x, Object[] es) {
Comparable<? super T> key = (Comparable<? super T>) x;
...
if (key.compareTo((T) e) >= 0)
break;
...
}

比如,我们创建整数队列并添加一些东西:

PriorityQueue<Integer> queue = new PriorityQueue<>();
queue.add(1);

如果我理解通配符的概念,使用 <? super T> 的唯一效果而不是 <T>是编译器扩展了 compareTo 的可能参数类型吗?

public interface Comparable<T> {
public int compareTo(T o);
}

Integer 的任何父类(super class).但我想知道为什么以及如何在这里使用它。任何示例,其中

Comparable<T> key = (Comparable<T>) x;

还不够吗?还是在 Comparable 中使用“ super ”通配符是一种准则?

最佳答案

放宽泛型签名可以提高代码的灵 active ,尤其是当我们谈论参数类型时。一般准则是 PECS规则,但对于 Comparable ,需要这种灵 active 的实际例子很少见,因为这些例子意味着有一个基类型定义其所有子类型之间的自然顺序。

例如,如果您有类似的方法

public static <T extends Comparable<T>> void sort(Collection<T> c) {

}

你不能做以下事情

List<LocalDate> list = new ArrayList<>();
sort(list); // does not compile

原因是LocalDate工具 ChronoLocalDate你可以比较 ChronoLocalDate 的所有实现换句话说,它们都实现了 Comparable<ChronoLocalDate> .

所以,方法签名必须是

public static <T extends Comparable<? super T>> void sort(Collection<T> c) {

}

允许实际类型实现 Comparable用父类(super class)型参数化,就像 Collections.sort 已经宣布。


对于 siftUpComparable 的具体情况,即没有机会确定实际通用签名的内部 Collection 方法,它是否使用 Comparable<T> 确实无关紧要或 Comparable<? super T> ,正如它所需要的,是传递 T 实例的能力。到 compare方法,而即使提供实际参数也是由另一个未经检查的转换完成的。

事实上,由于类型转换未检查,它可能被转换为Comparable<Object>。同样,这将消除执行 (T) 的需要转换于 compare调用。

但显然,作者并没有打算与实际通用代码的用途相去甚远,而是使用了相同的模式,即使它在这里没有明显的好处。

关于java - 下界通配符(Comparable<?super K>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54680144/

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