[英]Generics compiles and runs in Eclipse, but doesn't compile in javac
注意 :这是关于null的Comparable和Comparator合同的衍生产品
这段代码在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
上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
是要推断的类型变量)。
也是在WinXP上以1.6.0_13向我发出的。 好吧,我只会坚持使用Eclipse :)
您可以通过显式指定泛型类来解决这个问题:
Comparator<String> namesComp = Stack.<String>nullComparableComparator();
我有一个类似的问题,并从jdk1.6.0_16升级到jdk1.6.0_23,它没有任何代码更改就消失了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.