我试图更一般地找到列表的最大值。我申请了通配符。
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新型变量?
答案 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);