2

我试图更普遍地找到列表的最大值。我应用了通配符。

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 编程语言中有两种类型:原始类型和引用类型还有一种特殊的 null 类型,即表达式的类型 null它没有名称。

什么是 CAP#1 新类型变量?

4

2 回答 2

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 TComparator 中的 可能? extends T与 Collection 中的 不同。

这就是这些错误的原因。

仅供参考,我不确定您是否受益于Collection<? extends T>. Collection<T>会正常工作。

于 2013-10-27T17:42:33.027 回答
1

您也可以OrderingGuava使用:

Ordering.from(comparator).max(collection);
于 2013-10-27T19:10:24.150 回答