更一般地查找列表的最大值

时间:2013-10-27 17:40:39

标签: java generics collections

我试图更一般地找到列表的最大值。我申请了通配符。

public class Main{
    public static void main(String[] args){ }
    public static <T extends Comparable<? extends T>> T max(Collection<? extends T> c){
        T max= c.iterator().next();
        for(T element : c){
            if(element.compareTo(max)>0) max=element;//Compile error
        }
        return max; 
    }
}

编译器给了我错误信息:

incompatible types: T cannot be converted to CAP#1
where T is a type-variable:
T extends Compareble<? extends T> declared in method <T>max(Collection<? extends T>)
where CAP#1 is a fresh type-variable:
CAP#1 extends T from capture ? extends T

我对此错误消息有一些疑问

什么意味着新的类型变量?在JLS 4.1中写的 Java编程语言中有两种类型:基本类型和引用类型和< em>还有一个特殊的null类型,表达式的类型 null没有名称。

什么是CAP#1新型变量?

2 个答案:

答案 0 :(得分:2)

使用

public class Main{
    public static void main(String[] args){ }
    public static <T extends Comparable<? super T>> T max(Collection<? extends T> c){
        T max= c.iterator().next();
        for(T element : c){
            if(element.compareTo(max)>0) max=element;
        }
        return max; 
    }
}

编辑:

问题在于T需要与T或T的任何超类相媲美。

你的T与T或T的某个子类相当,这是不够的。

或者,从另一个角度来看,比较器中的? extends T可能与集合中的? extends T不同。

这是造成这些错误的原因。

仅供参考,我不确定您是否会从Collection<? extends T>中的通配符中受益。 Collection<T>可以正常使用。

答案 1 :(得分:1)

您还可以使用Guava中的Ordering

Ordering.from(comparator).max(collection);