注意:这是从Comparable和Comparator合约衍生出来的,涉及null
该代码可以在Eclipse(20090920-1017)中编译并正常运行
import java.util.*; public class SortNull { static <T extends Comparable<? super T>> Comparator<T> nullComparableComparator() { return new Comparator<T>() { @Override public int compare(T el1, T el2) { return el1 == null ? -1 : el2 == null ? +1 : el1.compareTo(el2); } }; } public static void main(String[] args) { List<Integer> numbers = new ArrayList<Integer>( Arrays.asList(3, 2, 1, null, null, 0) ); Comparator<Integer> numbersComp = nullComparableComparator(); Collections.sort(numbers, numbersComp); System.out.println(numbers); // "[null, null, 0, 1, 2, 3]" List<String> names = new ArrayList<String>( Arrays.asList("Bob", null, "Alice", "Carol") ); Comparator<String> namesComp = nullComparableComparator(); Collections.sort(names, namesComp); System.out.println(names); // "[null, Alice, Bob, Carol]" } }
但是它不能在上编译javac 1.6.0_17。这是错误消息:
SortNull.java:17: incompatible types; no instance(s) of type variable(s) T exist so that java.util.Comparator<T> conforms to java.util.Comparator<java.lang.Integer> found : <T>java.util.Comparator<T> required: java.util.Comparator<java.lang.Integer> Comparator<Integer> numbersComp = nullComparableComparator(); SortNull.java:25: incompatible types; no instance(s) of type variable(s) T exist so that java.util.Comparator<T> conforms to java.util.Comparator<java.lang.String> found : <T>java.util.Comparator<T> required: java.util.Comparator<java.lang.String> Comparator<String> namesComp = nullComparableComparator(); 2 errors
有人可以解释为什么差异吗?这是一个错误吗?如果是这样,谁有错误?
这是一个已确认的错误:错误ID 6468354。这是相关的摘录:
此问题是由以下事实引起的:有时javac的JLS3 15.12.2.8实现忽略了递归边界,有时却忽略了(在这种情况下)。当递归边界包含通配符时,在计算未推断类型变量时将包括此类边界。这样可以进行后续的子类型化test (Integer <: Comparable<? super T>,其中T要推断出类型变量。
将在6369605之后修复
在WinXP上也以1.6.0_13出现在我身上。嗯,我只是坚持使用Eclipse :)