为了账号安全,请及时绑定邮箱和手机立即绑定

泛型可以在Eclipse中编译和运行,但不能在javac中编译

泛型可以在Eclipse中编译和运行,但不能在javac中编译

qq_笑_17 2019-11-20 09:38:58
该代码可以在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有人可以解释为什么差异吗?这是错误吗?如果是这样,谁有错误?
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

这是一个已确认的错误:错误ID 6468354。这是相关的摘录:


此问题是由以下事实引起的:有时javac的JLS3 15.12.2.8实现忽略递归边界,有时却忽略(如本例所示)。当递归边界包含通配符时,在计算未推断类型变量时将包括此类边界。这样可以进行后续的子类型化test (Integer <: Comparable<? super T>,其中T要推断出类型变量)。


将在6369605之后修复


在WinXP上也以1.6.0_13出现在我身上。嗯,我只是坚持使用Eclipse :)


查看完整回答
反对 回复 2019-11-20
?
当年话下

TA贡献1890条经验 获得超9个赞

您可以通过显式指定泛型类来解决此问题:


Comparator<String> namesComp = Stack.<String>nullComparableComparator();


查看完整回答
反对 回复 2019-11-20
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

我遇到了类似的问题,并从jdk1.6.0_16升级到jdk1.6.0_23,它消失了,没有任何代码更改。


查看完整回答
反对 回复 2019-11-20
  • 3 回答
  • 0 关注
  • 541 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信