(如果这是重复的,请指出我正确的答案!我搜索并阅读了几个(> 5)相关问题,但似乎没有出现在标记上.还查看了泛型常见问题和其他来源…)
显然正确的做法是,当集合类采用比较器时,它应该具有类型Comparator对于你的参数化类型T.你可以看到很多地方,例如TreeMap.好的.
我的问题是使用Comparator.naturalOrder(),它是在T扩展Comparable但返回一个Comparator< T>.我正在尝试在我的集合类中有一个字段,它包含用户指定的比较器或Comparator.naturalOrder比较器.
我无法让它发挥作用.我的问题都是相关的:
> Comparator.naturalOrder如何正确使用?
>我可以做我想要的那个有存储用户提供的比较器或naturalOrder比较器的字段吗?
>鉴于大多数集合类(在框架中)都参数化了T而不是T实现了Comparable,所以这是选择的设计模式,naturalOrder如何有用,因为它需要后一个有界通配符,而不是无约束类型参数?
谢谢!
下面是编译器错误的实际示例:
所以:如果我在某些类中有这样的代码,其中T没有边界(如在所有现有的集合类中):
class Foo {
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>
那么如果我决定放弃优势呢?超级T然后我有:
class Foo {
private Comparator 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>