(如果这是重复的,请指向正确的答案!我搜索并阅读了几个(>5)相关问题,但没有一个看起来符合要求。还查看了Generics FAQ和其他来源...)
显然,当集合类采用比较器时,它应该具有类型Comparator<? super T>
,用于参数化类型T
。你可以在很多地方看到这一点,例如TreeMap
。好的。
我的问题是如何处理Comparator.naturalOrder()
,它是基于T extends Comparable<? super T>
进行参数化的,但返回一个Comparator<T>
。我正在尝试在我的集合类中拥有一个字段,该字段保存用户指定的比较器或Comparator.naturalOrder
比较器。
我无法让它工作。我的问题都与以下内容相关:
Comparator.naturalOrder
如何正确使用?- 我能做我想做的事情吗?即拥有一个字段,在其中存储用户提供的比较器或
naturalOrder
比较器?
- 我能做我想做的事情吗?即拥有一个字段,在其中存储用户提供的比较器或
- 鉴于大多数集合类(在框架中)是基于
T
而不是T implements Comparable<? super T>
进行参数化的,因此选择了这种设计模式,那么naturalOrder
如何有用,因为它需要后者有界通配符,而不是无约束类型参数?
谢谢!
以下是实际示例和编译器错误:
所以:如果我在某个类中有像这样的代码,其中T没有边界(如所有现有的集合类):
class Foo<T> {
private Comparator<? super T> comparator;
public void someMethod(Comparator<? super T> comparator)
{
this.comparator = comparator; // no compile error
this.comparator = Comparator.naturalOrder(); // incompatible types
}
}
出现以下错误:
Error:(331, 50) java: incompatible types: inferred type does not conform to upper bound(s)
inferred: T
upper bound(s): java.lang.Comparable<? super T>
如果我决定放弃使用? super T
的优势,则会有以下结果:
class Foo<T> {
private Comparator<T> comparator;
public void someMethod(ComparatorT> comparator)
{
this.comparator = comparator; // no compile error
this.comparator = Comparator.naturalOrder(); // incompatible types
}
}
我需要
Error:(nnn, 50) java: incompatible types: inference variable T has incompatible bounds
equality constraints: T
upper bounds: java.lang.Comparable<? super T>
T
声明的集合(比如 TreeMap)的源代码时,我发现它们在运行时会进行 Comparable 强制转换以获得比较器。感谢您的解释! - davidbak